ライブラリを C に含める代わりに std.c ライブラリをインポートすると、C コードは D コンパイラでコンパイルされますか、それとも他のバックワード互換性の問題がありますか?
3 に答える
D には、C コードが意図したとおりに動作しない原因となる微妙な点がいくつかあります。たとえば、整数の昇格ルールはまったく同じではありませんが (ほとんど)、初期化ルールも異なります (たとえば、浮動小数点値 (そのような配列を含む) は NaN に初期化されます)。さらに、C 関数ポインター構文は最近廃止されたため、一部の C 型構文を同等の D 構文に変換する必要がある場合があります。
ただし、一般的には下位互換性に重点が置かれており、ほとんどのC コードは、C と同じセマンティクスを使用して、D でも問題なく (またはごくわずかな変更で) コンパイルする必要があります。
std.c
また、非推奨であることにも注意してください。core.stdc
代わりに使用してください。
CまたはC++ファイルを取得してDコードとしてコンパイルすることはできません。また、Dの#include
Cヘッダーだけをコンパイルすることはできません。DはCまたはC++との下位互換性がありません。むしろ、extern(C)
Dコードで関数を宣言し、それらのC関数をD関数であるかのように呼び出すことができます(当然、それらが定義されているCライブラリにリンクする必要があります)。見る
DからCコードを呼び出す方法の詳細については。
druntime(core。*モジュールを含む)には、かなりの数の標準CおよびOS関数(core.stdc。*およびcore.sys。*モジュール内)の宣言がありますが、druntimeを確認する必要があります。現時点では適切に文書化されていないため、ファイルを作成してそれらが何であるかを確認してください。呼び出したい他のC関数については、上記のリンクで説明されているように、自分で簡単に宣言を作成できます。
現在、CとDは構文的に非常に似ているため、Cコードの一部のセクションはDコードと同じように正常にコンパイルされますが、プログラム全体ではコンパイルされません。一般的な規則として、C / C ++コードは、同じセマンティクスを持つ有効なDコードとしてコンパイルされるか、Dコードとしてコンパイルされません。それが当てはまらない場合がいくつかありますが(たとえば、静的配列はC / C ++とは異なり、Dの値型です)、ほとんどすべての場合に当てはまります。これにより、C / C ++コードをDに移植するのはかなり簡単になりますが、C++のようにDがCコードと下位互換性を持つことは意図されていませんでした。
あなたの質問は、OP 本文で質問したものとは異なります。
Q1: C ライブラリを使用する場合、D は C と後方互換性がありますか?
A: はい。C ライブラリを使用できます。詳細については、こちらをご覧ください。
Q2: C コードは D コンパイラでコンパイルできますか?
A: D コンパイラの実装で C コードをコンパイルできるようにすることは決して意図していませんでした。ただし、Dは C コンパイラのデータ型、レイアウト、および関数呼び出し/戻りシーケンスと一致するため、多くの C コードがコンパイルされます。Zor が指摘したように、 C スタイルの関数ポインター構文と、C スタイルの配列ポインター構文は廃止されました。