1

I have a big project (400 files) and all of the headers have include guards and everything, however I get 500 LNK2005 errors.

Could it be that I have function bodies defined in some headers? Cause I saw the same things in the DirectX utility headers(DirectXCollision has some of it's functions are completely in the header).

Or could it be because they are using .inl files instead of .cpp?

4

3 に答える 3

3

一部のヘッダーで関数本体が定義されている可能性がありますか?

はい、そうかもしれません。複数の翻訳単位で関数を定義すると、シンボル定義の重複エラーが発生します。

これらの関数を宣言することで、重複エラーを回避できますinline[7.1.2]/2読み取り:

インライン指定子を使用した関数宣言 (8.3.5、9.3、11.3) は、インライン関数を宣言します。インライン指定子は、呼び出し時点での関数本体のインライン置換が通常の関数呼び出しメカニズムよりも優先されることを実装に示します。呼び出し時にこのインライン置換を実行する実装は必要ありません。ただし、このインライン置換が省略された場合でも、7.1.2 で定義されたインライン関数の他の規則は引き続き尊重されます。

于 2013-01-11T00:16:24.663 に答える
2

インクルード ガードは、同じヘッダーを同じコンパイル ユニット (1 つの cpp ファイル) に複数回インクルードすることを防ぐだけです。ヘッダーを 2 番目の cpp ファイルにインクルードしてからそれらをリンクすると、ヘッダーがもたらすものは両方に含まれます。そのため、通常、ヘッダーに関数の実装を含めることはお勧めできません。

関数をインラインで宣言することでこれを回避できます。その後、コンパイラはそれらをコピーして貼り付けます。

于 2013-01-11T00:16:48.313 に答える
0

ヘッダー ファイルでグローバル変数を定義していますか? それがエラーの原因である可能性があります。そして、ガードを含めることは役に立ちません。

グローバル変数は、1 つの翻訳単位でのみ定義する必要があり、他のすべての翻訳単位で外部化する必要があります。

たとえば。xh では、

int myVar;

a.cpp と b.cpp の両方に xh を #include すると、xh にガードを含めたとしてもリンカー エラーが発生します。

myVar は a.obj と b.obj の両方で定義され、リンカは 2 つの myVar を見つけるためです。

于 2013-01-11T17:35:59.333 に答える