6

ガード付きヘッダー ファイルで定義された非インライン関数

#if !defined(HEADER_RANDOM_H)
#define HEADER_RANDOM_H 
void foo()
{
//something
}
#endif

リンカエラーの結果:someother.objファイルですでに定義されています関数をインラインにすることは正常に機能しますが、最初のケースで関数がすでにエラーになっている理由を理解できません。

4

3 に答える 3

11

ヘッダーが複数のソース ファイルに含まれていて、関数が「インライン」としてマークされていない場合、複数の定義があります。インクルード ガードは、同じソース ファイルへの複数のインクルードを防ぐだけです。

于 2009-07-02T11:09:25.400 に答える
8

1 つの定義ルールに違反しています。inline関数をヘッダーで直接定義する場合は、関数を複数回定義できるように --としてマークする必要があります。また、他の意味がないことに注意しinlineてください。特に、コンパイラにインライン呼び出しを強制するものではありません (一般的な信念に反して)。

于 2009-07-02T11:13:15.127 に答える
4

インラインではないため、各翻訳単位には関数の独自のコピーがあり、その結果、関数が複数回定義されます。

于 2009-07-02T11:07:57.447 に答える