2009-07-02 20 views
5

ガード付きヘッダーファイルで定義されている非インライン関数ヘッダーファイルに非インライン関数が定義されているとリンカーエラー?

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

リンカーエラーの結果:someother.objファイルですでに定義されています 関数インラインをうまく動作させるが、なぜ関数が既にエラーになっているのか理解できません最初のケースで。

答えて

9

ヘッダーが複数のソースファイルに含まれており、関数が "インライン"としてマークされていない場合、複数の定義があります。インクルードガードは、同じソースファイル内の複数のインクルードを禁止します。

+0

ありがとうございました......... – yesraaj

+0

クラス宣言の中で定義されているクラスメソッドについて話すとき、 'inline'キーワードは不要です。http://stackoverflow.com/a/145952/ 2436175 – Antonio

4

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

7

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

関連する問題