4


0

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

DMD 1を使用すると、これは機能します。

void f(char * s); // Cライブラリの関数の定義

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

void f(const(char)* s); // Cライブラリの関数の定義

私は何をすべきか? 単に `char *`を使用して、 'クライアント’コードが文字列をどういうわけか可変にするのですか? それともコードをコンパイルするコンパイラのバージョンに応じて型を変更しますか? 前者の場合、それらをミュータブルにするための最善の方法は何ですか? 私は.dupがそれをするだろうと思ったが、コンパイラはそれのバーを持っていませんでした。 後者の場合、どうしたらいいでしょうか。 私はこれを試しました:

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

void f(charptr s);

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

2 Answer


5


http://www.digitalmars.com/d/1.0/statement.html#MixinStatement[mixin]構造を使用して、すべてのバージョンで有効ではない言語バージョン固有のコードを使用できます。 例:
static if(version_major <2){alias char * charptr; } else {mixin( "alias const(char)* charptr;"); }

あなたの実際の質問に関して、私はCとCライブラリをインターフェースするときと同じようにすることをお勧めします - D2のために const(char)`そしてD1のために `char *`の型を定義します関数が書き込むバッファとして `char *`を取る場合、おそらく `const(char)`に "charptr"のような一般的な名前を付けるのは適切ではないでしょう)。 `LPCSTRはうまくいくでしょう;)

私は「それらを変更可能にするための最善の方法は何か」という質問を理解していませんでした。


-1


これにはミックスインを使用しないでください。仕事には不適切なツールです。 あなたが本当に必要としているのは 'version’ステートメントです、それについてはここのConditional Compilationページで読むことができます:http://www.digitalmars.com/d/2.0/version.html

別のバージョン用のコードをコンパイルしたり調べたりすることはありません。 これにより、DバージョンやOSが異なると、異なるコードを構築することができます。

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