0

重複の可能性:
「ダイヤモンド遺産」構造に #Include することは可能ですか?

私はそのようなプログラムをいくつか構築しています:

"a.c" #includes "a.h" and #includes "b.h"
"b.c" #includes "b.h"

「var」という名前の「bh」のみで変数を宣言するとしましょう

「cmd」で「nmake」を使用してコンパイルしようとすると、次のエラーが発生します。

b.obj : エラー LNK2005: var は既に a.obj で定義されています

でもacやahでは定義せず、bhだけで

何が原因でしょうか? ありがとう

4

1 に答える 1

1

でもacやahでは定義せず、bhだけで

それはそれがどのように機能するかではありません。インクルードされたすべてのヘッダーのすべてのコードがプリプロセッサによってまとめられ、コンパイラに渡されます。コンパイラはそれをオブジェクト ファイルにコンパイルします。このコードは「翻訳単位」と呼ばれます。同じ変数が別の翻訳単位で定義されている場合、生成されたオブジェクト ファイルにも存在します。これらのオブジェクト ファイルを一緒にリンクすると、両方に同じ変数が定義されるため、リンカーはシンボルの重複について警告します。

代わりに、1 つの *.c ファイルで変数を定義し、*.h ファイルでのみ宣言する必要externがあります。そうすれば、他の翻訳単位は変数を認識しますが、それ自体を定義しようとしません。実際に定義されている *.c ファイルを含む翻訳単位でのみ定義されます。

于 2012-12-18T17:38:59.813 に答える