forked from dlang/dlang.org
-
Notifications
You must be signed in to change notification settings - Fork 4
/
pragma.dd
126 lines (100 loc) · 3.92 KB
/
pragma.dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
Ddoc
$(SPEC_S プラグマ,
$(GRAMMAR
$(GNAME Pragma):
$(B pragma) $(B $(LPAREN)) $(I Identifier) $(B $(RPAREN))
$(B pragma) $(B $(LPAREN)) $(I Identifier) $(B ,) $(GLINK2 expression, ArgumentList) $(B $(RPAREN))
)
$(P プラグマとは、コンパイラへ特別な情報を渡したり、
ベンダ特有のD言語の拡張を追加するための方法です。
プラグマには、$(SINGLEQUOTE ;) で終わらせてそれ自身で完結させる使い方も、
文、ブロック、宣言、
宣言ブロックなどに影響を及ぼすプラグマとしての使い方もあります。
)
$(P プラグマは、宣言としても
$(GLINK2 attribute, DeclarationBlock)
のような属性ブロックや文としても、
$(GLINK2 statement, PragmaStatement) としても使用できます。
)
-----------------
pragma(ident); // それ自身で完結
pragma(ident) declaration; // 1つの宣言に影響する
pragma(ident): // 後ろに続く複数の宣言に影響する
declaration;
declaration;
pragma(ident) { // ブロック内の全ての宣言に影響する
declaration;
declaration;
}
pragma(ident) statement; // 1つの文に影響する
pragma(ident) { // ブロック内の全ての文に影響する
statement;
statement;
}
-----------------
$(P プラグマの種類は、$(I Identifier) によって決定されます。
$(I ExpressionList) は、
$(ASSIGNEXPRESSION) のコンマ区切りリストです。 $(ASSIGNEXPRESSION)
は式として構文解析できる必要がありますが、
それがどのように解釈されるかは、各々のプラグマの意味によって変わります。
)
<h2><a name="Predefined-Pragmas">定義済みプラグマ</a></h2>
$(P 全ての実装は、単に無視するだけでも構いませんが、
これらのプラグマに対応しなくてはなりません:
)
$(DL
$(DT $(B msg))
$(DD コンパイル中にメッセージを表示します。
$(ASSIGNEXPRESSION) には1個の文字列リテラルを指定します:
-----------------
pragma(msg, "compiling...");
-----------------
)
$(DT $(B lib))
$(DD オブジェクトファイル中に、
$(ASSIGNEXPRESSION) で指定されたライブラリとリンクする指令を挿入します。
$(ASSIGNEXPRESSION) には1個の文字列リテラルを指定します:
-----------------
pragma(lib, "foo.lib");
-----------------
)
$(V2
$(DT $(B startaddress))
$(DD 第一引数がプログラム開始アドレスであるという情報を、
オブジェクトファイルに
埋め込むようにします:
-----------------
void foo() { ... }
pragma(startaddress, foo);
-----------------
これは通常のアプリケーションレベルプログラミングで使うことは想定されておらず、
システム側の処理のための機能です。
普通のアプリケーションのスタートアドレスは、
ランタイムライブラリによって適切に扱われます。
)
)
)
<h2>ベンダ固有のプラグマ</h2>
$(P ベンダ固有の $(I Identifier) は、
バージョン識別子と同様に、
ベンダの商標名を接頭辞にして定義します:
)
-----------------
pragma(DigitalMars_funky_extension) { ... }
-----------------
$(P コンパイラは、認識できない $(I Pragma) に対してはエラーを出さなくてはなりません。
例えベンダ固有のプラグマであってもです。これは要するに、
ベンダ固有プラグマはversion文の中に配置する必要があるということです:
)
-----------------
version (DigitalMars)
{
pragma(DigitalMars_funky_extension)
{ ... }
}
-----------------
)
Macros:
TITLE=プラグマ
WIKI=Pragma
CATEGORY_SPEC=$0