3

私は本当に D を使いたいと思っています。なぜなら、その言語構造は私が気になる多くのことを C++ よりも優れているからです。しかし、ほぼ強​​制的な GC (ここで処理された [種類] の問題)、わずかに強力ではない演算子のオーバーロード (例外opDispatch.opDispatchは魅力的)、および次の問題はちょっと私をオフにしています。

Dでメソッド宣言を定義から分割することは可能ですか? もしそうなら、どのように?そうでない場合、なぜですか?

「方法」の動機付けの例: ユーザー コードの作成者の目から実装を隠すために、C ヘッダーとライブラリのように、バイナリ オブジェクトの隣にインターフェイス関数の小さなヘッダー ファイルを提供すること。好み: ユーザー コードがガベージ コレクターをハックしたかどうか、または単に druntime なしでコンパイルしているかどうかに依存しない (これは、ここのコメントにある)。

4

3 に答える 3

3

を使用して、実装を指定せずに関数を宣言できますextern。たとえば、次のようになります。

extern(D):
void foo(string name);

次に、オブジェクト ファイル/アーカイブにリンク用の実装を提供するだけです。モジュール名は関数のマングル名の一部であるため、ヘッダー ファイルにコンパイル済みモジュールと同じモジュール名が必要であるか、extern(C)マングリングを無効にするために使用できることに注意してください (オーバーロードを排除し、C 呼び出し規則を使用します)。

于 2013-08-05T23:12:47.903 に答える
3

アダムはすでにすべてを説明しました。追加の例を追加しようとします:

mylib という名前のライブラリを開発していて、関数 foo() と bar() があるとします。コードとライブラリ テスト アプリケーションは、最初は次のようになります。

mylib.d - インターフェイス ファイル

module mylib;

void foo();
void bar();

mylib_impl.d - 定義はこちら

module mylib;

import std.stdio;

void foo() {
  writeln("foo()");
}

void bar() {
  writeln("bar()");
}

mylib_test.d - テスト アプリケーション

// To compile: dmd mylib_impl.d mylib_test.d
// NOTE: we do not compile the "interface" file mylib.d !!
module mylib_test;

import mylib;

int main() {
  foo();
  bar();

  return 0;
}

ここで、.di ファイルが単に利便性と明確さのためにあることを理解するのは難しくありません。インターフェイス ファイルを使用する場合は、mylib.d を mylib.di に、mylib_impl.d を mylib.d に名前変更します。mylib_test.d はそのまま残ります。

于 2013-08-06T14:48:02.787 に答える