英語版
このページの英語版を見る

htod

Warning - htod は活発に開発されていない。 D Wikiのバインディングジェネレータを参照のこと。

DはCコードとバイナリ互換性があるが、CコードのコンパイルやCヘッダーファイルのコンパイルはできない。 CコードやCヘッダーファイルはコンパイルできない。そのため DがCコードとリンクするためには、CヘッダーファイルのC宣言を変換する必要がある。 をDモジュールに変換する必要がある。 モジュールに変換する必要がある。htod 。 Cヘッダーファイルの変換を支援するマイグレーション・ツールである。

htod は、Digital MarsのCおよびC++コンパイラのフロントエンドからビルドされている。 Mars CおよびC++コンパイラのフロントエンドから構築されている。CコンパイラやC++コンパイラと同じように動作する。 コンパイラと同じように動作する。 モジュールである。

マクロ__HTOD__ はあらかじめ定義されており、1 に設定されている、 これは、Cのヘッダー・ファイルを改良してより良いD出力を得るのに便利である。 これは、Cヘッダー・ファイルを改良して、より良いD出力を得るのに便利である。

ダウンロード

htod

使用方法

htod cheader.h [dimport.d] [-cpp] [-hc] [-hi] [-hs] [-ht] { C compiler switches }

ここで

cheader.h
CまたはC++ヘッダ入力ファイル
dimport.d
Dソースコード出力ファイル(デフォルトはcheader.d)
-cpp
C++ヘッダーファイルを示す
-hc
デフォルトでは、htod は、ファイル中のCおよびC++宣言を、 で始まる出力ファイルに挿入する。 //C を出力ファイルに挿入する。 -hc を指定すると、これが抑制される。 htod 、正しい出力ファイルを生成していると確信できる場合にのみ使用する。 ヘッダー・ファイルが __HTOD__).
-hi
デフォルトでは、htod#include "file" を表す。 対応するimport-hi 。 宣言もD宣言に変換される。 に変換される。すべてのインクルード・ファイルの宣言は関係なく解析される。 -hi インクルード・ファイルの階層全体を単一のDインポートで置き換える場合に便利である。 を1つのDインポートで置き換えるときに便利である。 #include <file> のようなシステム・インクルードは影響を受けない。 -hiには影響されない。 -hs も参照のこと。
-ht
デフォルトでは、htod は、typedef 名を使った型を、その名前を使った型として記述する。 として記述する。-ht 。 が使われるようになる。これは、マクロやtypedef、#includeのレイヤーを「ドリルダウン」して、その下にある型を見つけるのに非常に便利である。 マクロ、typedef、#includesの階層を "掘り下げる"ことで、根本的な型がわかる。
-hs
-hi と同じように動作するが、システム・インクルードも同様に移行される。 も同様に移行される。
Cコンパイラー・スイッチ
-D-I のようなCまたはC++コンパイラ・スイッチ。 ようなCまたはC++コンパイラー・スイッチを使用する。

Cのtest.hファイル:

unsigned u;
#define MYINT int
void bar(int x, long y, long long z);

で翻訳される:

htod test.h

ファイルtest.dを生成する:

/* htodによってtest.hからDに変換された */
module test;
//C     unsigned u;
extern (C):
uint u;
//C     #define MYINT int
//C     void bar(int x, long y, long long z);
alias MYINT = int;
void  bar(int x, int y, long z);

Cの宣言の先頭には文字列"//C " が付く。

型のマッピング

Cの型は以下のようにマッピングされている。これらのマッピングは Digital Mars C/C++では正しいが、あなたのCコンパイラでは正しくないかもしれない。 Cコンパイラでは正しくないかもしれない。D基本型は固定サイズであるが、C基本型は実装定義サイズである。 型のサイズは処理系定義: である。

CからD型へのマッピング
C型 D型
void 無効
ブール ブール
wchar_t wchar
char char
符号付きchar バイト
符号なしchar ubyte
short ショート
符号なしショート ushort
int int
符号なし uint
long int
符号なし long uint
long long long
符号なし long long ulong
float float
double double
long double 実数
虚数 float ifloat
イマジナリーダブル idouble
イマジナリーロングダブル 複素数
複素数 float cfloat
複素数 double cdouble
複素数 long double クリール

制限事項

C宣言とD宣言の一対一の対応はない。 とD宣言は一対一に対応しない。Dモジュールの出力を見直す必要がある。 Dモジュールの出力を見直す必要がある。 さらに

  1. さらに Cヘッダーは、マクロではなく、typedefsとsを使って書くべきである。 enumsを使うべきである。 htod は、単純なマクロ#defines をaliasconst の宣言に変換しようとする。 その場合でも、マクロは完全に展開されてから解析される。
  2. Cの条件付きコンパイル Dversionstatic if 宣言への変換は試みられない。
  3. 誤った条件付きコンパイル セクションの出力は生成されない。
  4. htod は宣言のみを変換する。 Cコードは変換しない。
  5. C++リンケージを持つ宣言は変換できない。 C++とのインターフェイスは、どのようなC++コードに対しても作成されなければならない。
  6. C .hファイルに存在するC言語拡張は認識されないことがある。 に存在するC言語拡張は認識されないことがある。
  7. プラグマは変換されない。
  8. タグ名は、通常の名前空間にある タグ名は、通常の名前空間の名前と衝突しないと仮定される。
  9. ASCII以外の文字データは、必要に応じてUTFに変換する必要がある。 に変換する必要がある。
  10. Cchar 型は、D 型にマッピングされるものとする。 Dchar 型に対応すると仮定される。しかし、これらは個別に byte に変換されるべきかどうかを個別に調べる必要がある。 ubyte 型に変換すべきである。Cchar 型が符号付きか符号なしかは、実装によって定義される。 は処理系定義である。Dchar 型は符号なしである。 は符号なしである。
  11. 名前付きC列挙型メンバは、C言語のように周囲のスコープに挿入されない。 スコープに挿入されない。
  12. Dモジュールはそれぞれ独自の名前空間にあるが、C のヘッダーファイルはすべて同じグローバルな名前空間にある。つまり これは、他のモジュールで定義された名前へのD言語の参照は、修飾が必要な場合があることを意味する。 を修飾する必要がある。

バグ

  1. デフォルトの構造体メンバ "以外では のアラインメントが考慮されない。
  2. Linuxバージョンがない。