Improve this page
Github へのログインが必要です。
簡単な修正は、ここから fork、オンライン編集、pull request ができます。
大きな修正については、
通常の clone で行って下さい。
Page wiki
関連するWikiページを参照・編集
English
このページの英語版(原文)
htod
D は C のコードとのバイナリ互換性はありますが、 CのコードをコンパイルしたりCのヘッダを読み込むことはできません。 DとCのコードをリンクするためには、ヘッダにあるCの宣言を、 Dのモジュールへと変換する必要があります。 htod は、 Cのヘッダからの変換をサポートする手助けとなるツールです。
htod は Digital Mars C/C++ コンパイラのフロントエンドを元に作成されています。 出力がオブジェクトコードではなくDのモジュールであることを除けば、 あたかもC/C++コンパイラであるかのように動作します。
マクロ __HTOD__ があらかじめ 1 に定義されています。 このマクロを使うことで、D へ変換しやすい C のヘッダを書くのが簡単になります。
ダウンロード
使い方
htod cheader.h [dimport.d] [-cpp] [-hc] [-hi] [-hs] [-ht] { C compiler switches }
それぞれのオプションの意味は以下の通りです。
- cheader.h
- C/C++ のヘッダファイル (入力)
- dimport.d
- D のソースコードファイル (出力) (デフォルトは cheader.d)
例
C の test.h ファイルを:
unsigned u;
#define MYINT int
void bar(int x, long y, long long z);
次のコマンドで変換すると:
htod test.h
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);
Cでの対応する宣言が "//C " コメントで残されています。
型の対応関係
C の型は以下の表の通り変換されます。これらの対応は Digital Mars C/C++ に関しては正確ですが、他のCコンパイラにとっては不適切かもしれません。 Dの基本型のサイズは規格で固定されていますが、 Cの型のサイズは処理系依存となっているのが原因です。
C の型 | D の型 |
---|---|
void | void |
_Bool | bool |
wchar_t | wchar |
char | char |
signed char | byte |
unsigned char | ubyte |
short | short |
unsigned short | ushort |
int | int |
unsigned | uint |
long | int |
unsigned long | uint |
long long | long |
unsigned long long | ulong |
float | float |
double | double |
long double | real |
_Imaginary float | ifloat |
_Imaginary double | idouble |
_Imaginary long double | ireal |
_Complex float | cfloat |
_Complex double | cdouble |
_Complex long double | creal |
制限事項
Cの宣言とDの宣言の間には、厳密な1対1対応は存在しません。 必ず、出力されたDモジュールの内容を見て、 正しく解釈されているか確認してから使うようにしてください。 他にもいくつか制限があります。
- 可能な限り、 C のヘッダはマクロではなく typedef と enum を使って記述されているべきです。 htod は単純な #define マクロについては、alias や const 宣言への変換を試みます。 とはいえ、ヘッダ内でのマクロ使用については解析前に全て展開されます。
- C の条件コンパイルを D の version や static if 宣言へと変換することは一切ありません。
- 条件コンパイル条件が偽となっている部分については、 なにも出力されません。
- htod は宣言のみを変換します。 Cのコードは変換しません。
- C++リンケージを持つ宣言は変換できません。 C++コードについては、まずCインターフェイスの作成が必要です。
- C のヘッダファイル中で使われた言語拡張については、 認識されない可能性があります。
- pragma は変換されません。
- タグ名は通常の名前空間と衝突しないことが 仮定されています。
- ASCII外の文字データは、 必要ならばUTFに変換しておく必要があります。
- C の char は D の char 型に対応すると仮定されています。しかしながら、 これについては個別にチェックして、byte や ubyte 型の方が適切ではないかチェックした方がよいでしょう。C の char 型がsignedかunsignedかは実装依存ですが、D の char 型はunsignedです。
- C の名前付き列挙体のメンバーは、Cでそうであるのと同様に、 周囲のスコープへと挿入されます。
- D のモジュールはそれぞれ個別の名前空間を持ちますが、 Cのヘッダファイルは全て共通のグローバル名前空間に置かれます。これは、 他のDのモジュールで宣言された名前への参照については、 修飾が必要となることを意味しています。
バグ
- デフォルトの構造体アラインメント以外は 考慮されていません。
- Linux版はありません。