forked from dlang/dlang.org
-
Notifications
You must be signed in to change notification settings - Fork 4
/
htod.dd
234 lines (187 loc) · 7.74 KB
/
htod.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
Ddoc
$(D_S htod,
$(P D は C のコードとのバイナリ互換性はありますが、
CのコードをコンパイルしたりCのヘッダを読み込むことはできません。
DとCのコードをリンクするためには、ヘッダにあるCの宣言を、
Dのモジュールへと変換する必要があります。
$(B htod) は、
Cのヘッダからの変換をサポートする手助けとなるツールです。
)
$(P $(B htod) は Digital Mars
C/C++ コンパイラのフロントエンドを元に作成されています。
出力がオブジェクトコードではなくDのモジュールであることを除けば、
あたかもC/C++コンパイラであるかのように動作します。
)
$(P マクロ $(B __HTOD__) があらかじめ $(B 1) に定義されています。
このマクロを使うことで、D へ変換しやすい
C のヘッダを書くのが簡単になります。
)
<h3>ダウンロード</h3>
$(P $(LINK2 http://ftp.digitalmars.com/htod.zip, htod)
)
<h3>使い方</h3>
$(GRAMMAR
$(B htod) $(I cheader.h) [$(I dimport.d)] [$(B -cpp)] [$(B -hc)] [$(B -hi)] [$(B -hs)] [$(B -ht)] { $(I C compiler switches) }
)
$(P それぞれのオプションの意味は以下の通りです。)
$(DL
$(DT $(I cheader.h)
$(DD C/C++ のヘッダファイル (入力)
)
)
$(DT $(I dimport.d)
$(DD D のソースコードファイル (出力) (デフォルトは $(I cheader).d))
)
)
$(DT $(B -cpp)
$(DD ヘッダが C++ で書かれていることを示す
)
)
$(DT $(B -hc)
$(DD デフォルトでは、$(B htod) はC/C++での宣言をそのまま
$(D //C ) でコメントアウトした形でファイルに付け加えます。
$(B -hc) はこの動作を抑制します。
$(B htod) が正しい結果を出力していることに確信が持てるときだけ
このオプションを使ってください。 (例えば
$(B __HTOD__)を使ったヘッダを変換しているときなど)
)
)
$(DT $(B -hi)
$(DD デフォルトでは、$(B htod) は $(D #include "file") を
対応する $(B import) 文に置き換えます。 $(B -hi) を指定すると、
#include先の宣言も含めて全てをDの宣言に変換して出力するようになります。
#include先の内容の解析はこのオプション指定にかかわらず行われます。
$(B -hi) は、#include階層全体を
ひとつのDのインポートモジュールに変換したいときに役に立ちます。
$(D #include <file>) のようなシステム#includeについては、
$(B -hi) は影響しません。
$(B -hs) も参照のこと。
)
)
$(DT $(B -ht)
$(DD デフォルトでは、$(B htod) はtypedefされた型名はそのまま使うようにして
変換します。 $(B -ht) を指定すると、対応する元の型に置き換えて出力が
行われます。これは、マクロやtypedef、#includeの層を掘り下げて
元々の型を探り当てるときに役立ちます。
)
)
$(DT $(B -hs)
$(DD $(B -hi) と似ていますが、こちらは更にシステム#includeについても
同様に変換出力を行います。
)
)
$(DT $(I Cコンパイラ スイッチ)
$(DD C/C++ コンパイラに対するスイッチ指定 ($(B -D) や $(B -I) など)は
$(LINK2 http://www.digitalmars.com/ctg/sc.html, dmc) のドキュメントを参照してください。
)
)
)
<h3>例</h3>
$(P C の test.h ファイルを:)
$(CCODE
unsigned u;
#define MYINT int
void bar(int x, long y, long long z);
)
$(P 次のコマンドで変換すると:)
$(CONSOLE
htod test.h
)
$(P test.d というファイルが生成されます。)
---
/* Converted to D from test.h by htod */
module test;
//C unsigned u;
extern (C):
uint u;
//C #define MYINT int
//C void bar(int x, long y, long long z);
alias int MYINT;
void bar(int x, int y, long z);
---
$(P Cでの対応する宣言が $(D "//C ") コメントで残されています。)
<h3>型の対応関係</h3>
$(P C の型は以下の表の通り変換されます。これらの対応は Digital Mars C/C++
に関しては正確ですが、他のCコンパイラにとっては不適切かもしれません。
Dの基本型のサイズは規格で固定されていますが、
Cの型のサイズは処理系依存となっているのが原因です。
)
$(TABLE1
<caption>C から D への型対応関係</caption>
$(TR $(TH C の型) $(TH D の型))
$(TR $(TD void) $(TD void))
$(TR $(TD _Bool) $(TD bool))
$(TR $(TD wchar_t) $(TD wchar))
$(TR $(TD char) $(TD char))
$(TR $(TD signed char) $(TD byte))
$(TR $(TD unsigned char) $(TD ubyte))
$(TR $(TD short) $(TD short))
$(TR $(TD unsigned short) $(TD ushort))
$(TR $(TD int) $(TD int))
$(TR $(TD unsigned) $(TD uint))
$(TR $(TD long) $(TD int))
$(TR $(TD unsigned long) $(TD uint))
$(TR $(TD long long) $(TD long))
$(TR $(TD unsigned long long) $(TD ulong))
$(TR $(TD float) $(TD float))
$(TR $(TD double) $(TD double))
$(TR $(TD long double) $(TD real))
$(TR $(TD _Imaginary float) $(TD ifloat))
$(TR $(TD _Imaginary double) $(TD idouble))
$(TR $(TD _Imaginary long double) $(TD ireal))
$(TR $(TD _Complex float) $(TD cfloat))
$(TR $(TD _Complex double) $(TD cdouble))
$(TR $(TD _Complex long double) $(TD creal))
)
<h3>制限事項</h3>
$(P Cの宣言とDの宣言の間には、厳密な1対1対応は存在しません。
必ず、出力されたDモジュールの内容を見て、
正しく解釈されているか確認してから使うようにしてください。
他にもいくつか制限があります。
)
$(OL
$(LI 可能な限り、
C のヘッダはマクロではなく $(B typedef) と
$(B enum) を使って記述されているべきです。
$(B htod) は単純な $(B #define)
マクロについては、$(B alias) や $(B const) 宣言への変換を試みます。
とはいえ、ヘッダ内でのマクロ使用については解析前に全て展開されます。)
$(LI C の条件コンパイルを
D の $(B version) や $(B static if) 宣言へと変換することは一切ありません。)
$(LI 条件コンパイル条件が偽となっている部分については、
なにも出力されません。)
$(LI $(B htod) は宣言のみを変換します。
Cのコードは変換しません。)
$(LI C++リンケージを持つ宣言は変換できません。
C++コードについては、まずCインターフェイスの作成が必要です。)
$(LI C のヘッダファイル中で使われた言語拡張については、
認識されない可能性があります。)
$(LI pragma は変換されません。)
$(LI タグ名は通常の名前空間と衝突しないことが
仮定されています。)
$(LI ASCII外の文字データは、
必要ならばUTFに変換しておく必要があります。)
$(LI C の $(B char) は
D の $(B char) 型に対応すると仮定されています。しかしながら、
これについては個別にチェックして、$(B byte) や
$(B ubyte) 型の方が適切ではないかチェックした方がよいでしょう。C の $(B char)
型がsignedかunsignedかは実装依存ですが、D の $(B char)
型はunsignedです。)
$(LI C の名前付き列挙体のメンバーは、Cでそうであるのと同様に、
周囲のスコープへと挿入されます。)
$(LI D のモジュールはそれぞれ個別の名前空間を持ちますが、
Cのヘッダファイルは全て共通のグローバル名前空間に置かれます。これは、
他のDのモジュールで宣言された名前への参照については、
修飾が必要となることを意味しています。)
)
<h3>バグ</h3>
$(OL
$(LI デフォルトの構造体アラインメント以外は
考慮されていません。)
$(LI Linux版はありません。)
)
)
Macros:
TITLE=htod
WIKI=htod
CATEGORY_DOWNLOAD=$0