プラグマ
Pragma: pragma ( Identifier ) pragma ( Identifier , ArgumentList )
プラグマとは、コンパイラへ特別な情報を渡したり、 ベンダ特有のD言語の拡張を追加するための方法です。 プラグマには、';' で終わらせてそれ自身で完結させる使い方も、 文、ブロック、宣言、 宣言ブロックなどに影響を及ぼすプラグマとしての使い方もあります。
プラグマは、宣言としても Pragma DeclarationBlock、 文としても PragmaStatement 記述可能です。
pragma(ident); // それ自身で完結 pragma(ident) declaration; // 1つの宣言に影響する pragma(ident): // 後ろに続く複数の宣言に影響する declaration; declaration; pragma(ident) // ブロック内の全ての宣言に影響する { declaration; declaration; } pragma(ident) statement; // 1つの文に影響する pragma(ident) // ブロック内の全ての文に影響する { statement; statement; }
プラグマの種類は、Identifier によって決定されます。 ExpressionList は、AssignExpression のコンマ区切りリストです。AssignExpression は式として構文解析できる必要がありますが、 それがどのように解釈されるかは、各々のプラグマの意味によって変わります。
定義済みプラグマ
全ての実装は、単に無視するだけでも構いませんが、 これらのプラグマに対応しなくてはなりません:
- msg
- コンパイル中にメッセージを表示します。AssignExpressions
には1個の文字列リテラルを指定します:
pragma(msg, "compiling...");
- lib
- オブジェクトファイル中に、AssignExpression
で指定されたライブラリとリンクする指令を挿入します。
AssignExpression は文字列リテラルでなければなりません:
pragma(lib, "foo.lib");
ベンダ固有のプラグマ
ベンダ固有のプラグマ識別子は、 バージョン識別子と同様に、 ベンダの商標名を接頭辞にして定義します:
pragma(DigitalMars_funky_extension) { ... }
コンパイラは、認識できないpragmaに対してはエラーを出さなくてはなりません。 例えベンダ固有のプラグマであってもです。これは要するに、 ベンダ固有プラグマはversion文の中に配置する必要があるということです:
version (DigitalMars) { pragma(DigitalMars_funky_extension) { ... } }