Improve this page
Github へのログインが必要です。
簡単な修正は、ここから fork、オンライン編集、pull request ができます。
大きな修正については、
通常の clone で行って下さい。
Page wiki
関連するWikiページを参照・編集
English
このページの英語版(原文)
プラグマ
Pragma:
pragma ( Identifier )
pragma ( Identifier , ArgumentList )
プラグマとは、コンパイラへ特別な情報を渡したり、 ベンダ特有のD言語の拡張を追加するための方法です。 プラグマには、‘;’ で終わらせてそれ自身で完結させる使い方も、 文、ブロック、宣言、 宣言ブロックなどに影響を及ぼすプラグマとしての使い方もあります。
プラグマは、宣言としても 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
- コンパイル中にメッセージを表示します。
AssignExpression には1個の文字列リテラルを指定します:
pragma(msg, "compiling...");
- lib
- オブジェクトファイル中に、
AssignExpression で指定されたライブラリとリンクする指令を挿入します。
AssignExpression には1個の文字列リテラルを指定します:
pragma(lib, "foo.lib");
- startaddress
- 第一引数がプログラム開始アドレスであるという情報を、
オブジェクトファイルに
埋め込むようにします:
void foo() { ... } pragma(startaddress, foo);
これは通常のアプリケーションレベルプログラミングで使うことは想定されておらず、 システム側の処理のための機能です。 普通のアプリケーションのスタートアドレスは、 ランタイムライブラリによって適切に扱われます。
ベンダ固有のプラグマ
ベンダ固有の Identifier は、 バージョン識別子と同様に、 ベンダの商標名を接頭辞にして定義します:
pragma(DigitalMars_funky_extension) { ... }
コンパイラは、認識できない Pragma に対してはエラーを出さなくてはなりません。 例えベンダ固有のプラグマであってもです。これは要するに、 ベンダ固有プラグマはversion文の中に配置する必要があるということです:
version (DigitalMars)
{
pragma(DigitalMars_funky_extension)
{ ... }
}