4

C ライブラリのヘッダー ファイルを D モジュールに変換していますが、C 文字列をどのように処理すればよいか疑問に思っていました。

DMD 1 を使用すると、次のように動作します。

void f(char* s);  // Definition for C library's function.

しかし、DMD 2 (私は個人的に使用していますが、モジュールが両方で機能することを望みます) を使用すると文字列が const になるため、モジュールを使用して同じコードを動作させるには

void f(const(char)* s);  // Definition for C library's function.

私は何をすべきか?char*「クライアント」コードを使用して文字列を変更可能にするだけですか?または、コードをコンパイルするコンパイラのバージョンに応じて型を変更しますか? 前者の場合、それらを変更可能にする最良の方法は何ですか? 私は .dup でそれができると思っていましたが、コンパイラにはそれがありませんでした。後者の場合、どうすればいいですか?私はこれを試しました:

version (D_Version2) {
    alias const(char)* charptr;
} else {
    alias char* charptr;
}

void f(charptr s);

残念ながら、DMD 2 バージョンは DMD 1 に対して有効なコードではなく、バージョン ブロック内のすべてのコードは、結果の実行可能ファイルにコードが含まれていなくても、コードをコンパイルするコンパイラに対して有効なコードでなければなりません。したがって、現在、コードは両方でコンパイルされますが、最初にエイリアスを変更する必要があります。これは、ご想像のとおり、理想的ではありません。

4

2 に答える 2

5

mixinコンストラクトを使用して、すべてのバージョンで有効ではない言語バージョン固有のコードを使用できます。例:

static if(version_major<2)
{
    alias char* charptr;
}
else
{
    mixin("alias const(char)* charptr;");
}

あなたの実際の質問に関しては、CライブラリをC++とインターフェースするときと同じことをすることをお勧めしますconst(char)*-D2およびchar*D1用の型を定義しますが、適切な場合にのみ使用します(たとえば、関数がchar*書き込みにバッファを受け取る場合) 、 const(char)*「charptr」のような一般的な名前を付けるのはおそらく適切ではないでしょう)。LPCSTR動作する可能性があります;)

「それらを変更可能にする最良の方法は何ですか」という質問がわかりませんでした。

于 2009-08-21T20:46:09.987 に答える
-1

これにはミックスインを使用しないでください。これは仕事にとって間違ったツールです。本当に必要なのは「バージョン」ステートメントです。これについては、次の条件付きコンパイルページで読むことができます:http ://www.digitalmars.com/d/2.0/version.html

別のバージョンのコードをコンパイル/確認することはありません。これにより、DバージョンやOSごとに、さまざまなコードを作成できます。

Mixinsはおそらく機能しますが、それは重いツールであり、(引用符の中に)強調表示されたコードがなく、物事を過度に複雑にしているだけです。versionステートメントは、この問題に完全に適しています。

于 2010-08-29T08:34:21.657 に答える