2017-03-13 17 views
0

C++コードでこのような奇妙なエラーが発生しました。クラス外の関数定義でC++リンカエラーが発生しました

いくつかの方法でヘッダファイルを管理したいと考えています。それをUtil.hppと呼ぶことができます。私はそれに以下の簡単な方法を持っています。

bool CheckVal(int value) { 

    if (value == 1) 
    return true; 
    else 
    return false;  
} 

私は別のクラスのCPPにUtil.hppが含ま&メソッドを呼び出します。私はリンカエラーと言って終わる

:-1: error: 3 duplicate symbols for architecture x86_64 

私はosxのclangでこれを構築しています。

どうすればこのエラーを取り除くことができますか?私は何をしているのですか?

機能をインライン化するにもかかわらず、エラーが発生します。本当に奇妙です!

+2

「インライン」にしてください。 –

+0

静的にします。これはCでも同様です。 –

+0

この単純な方法は、可能な限り単純ではありません。 –

答えて

2

あなたは、ヘッダーファイル内の空き関数定義を続ける場合は、inlineキーワードでそれらを行う必要があります。

inline bool CheckVal(int value) {  
// ^^^^^^ 
     return value == 1; 
    } 

そうでない場合は、関数定義はヘッダファイルが含まれ、すべての翻訳単位で表示され、リンカが複数見それの定義。私はあなたの上に行ったよう


またbool値を再調整するためにif/elseは必要ありません。


別の解決策は、単にヘッダ

bool CheckVal(int value); 

に関数を宣言し、別個の翻訳単位に実装(定義)を移動させることです。
少なくとも、インプリメンテーションで何かを変更した場合、そのヘッダー上の依存する翻訳単位を再コンパイルする必要がないという利点があります。

+0

インライン展開は役に立たない。本当に奇妙です。 cppファイルで宣言する以外のオプションはありますか? –

+0

@SegmentationFault'inline'はうまくいくはずです。他の場所で同じ機能を定義しましたか?問題を再現する[MCVE]で質問を編集してください。 –

+0

私は他の解決策に行きました。インライン展開が私のケースで助けにならない –

1

私は何をしているのですか?

一つの定義ルールは、(非インライン)関数は正確に一度†定義されなければならないことを要求します。

ヘッダーを複数の翻訳単位に含めると、複数の定義が存在するため、odrが違反します。

関数に複数の異なる定義がある場合、それはodrにも違反します。

どうすればこのエラーを取り除くことができますか?

解決策1:ヘッダーに関数を定義しないでください。代わりにソースファイルに定義してください。ソースファイルは他のソースファイルには含まれていないので、このアプローチを使用するときには正確に1つの定義が必要です。

解決策A:関数inlineを宣言してください。

どちらの場合も、同じ名前の他の機能がないことを確認してください。†


機能は、ODR-使用されている場合にのみ。この微妙さはこの質問には関係ありません。

関連する問題