ガード付きヘッダー ファイルで定義された非インライン関数
#if !defined(HEADER_RANDOM_H)
#define HEADER_RANDOM_H
void foo()
{
//something
}
#endif
リンカエラーの結果:someother.objファイルですでに定義されています関数をインラインにすることは正常に機能しますが、最初のケースで関数がすでにエラーになっている理由を理解できません。
ガード付きヘッダー ファイルで定義された非インライン関数
#if !defined(HEADER_RANDOM_H)
#define HEADER_RANDOM_H
void foo()
{
//something
}
#endif
リンカエラーの結果:someother.objファイルですでに定義されています関数をインラインにすることは正常に機能しますが、最初のケースで関数がすでにエラーになっている理由を理解できません。
ヘッダーが複数のソース ファイルに含まれていて、関数が「インライン」としてマークされていない場合、複数の定義があります。インクルード ガードは、同じソース ファイルへの複数のインクルードを防ぐだけです。
1 つの定義ルールに違反しています。inline
関数をヘッダーで直接定義する場合は、関数を複数回定義できるように --としてマークする必要があります。また、他の意味がないことに注意しinline
てください。特に、コンパイラにインライン呼び出しを強制するものではありません (一般的な信念に反して)。
インラインではないため、各翻訳単位には関数の独自のコピーがあり、その結果、関数が複数回定義されます。