2011-12-29 18 views
0

私はmain機能を持つファイルexample1.cppを1つ持っています。このファイルには#include mylib.h#include lib.hが必要です。ファイルmylib.h#include lib.hです。このプログラムをコンパイルしようとすると、エラーredefinition xyz functionが発生します。機能の再定義

example1.cpp

#include mylib.h 
#include lib.h 

int main(){ 
//code 
} 

mylib.h

#include lib.h 

//rest code 
+3

実際のエラーメッセージを表示するには、ヘッダーファイルにコードを表示してください。また、コピー/貼り付けを使用してください。 –

+3

ガードを使用していますか? –

+0

@ userr902691これらのいずれかが問題を解決した場合は、問題を最もよく解決する答えを[承諾](http://stackoverflow.com/faq#howtoask)することを忘れないでください。 –

答えて

4

あなたはredifinitionsを避けるための#defineで.hファイルをラップする必要があります。例:

#if !defined(_MY_LIB_H_) 
#define _MY_LIB_H_ 

// Add your function definitions here... 

#endif // _MY_LIB_H_ 

これはどこにでも含めることができ、関数定義は一度読み取られます。また、コンパイラに応じて#ifndefを使用できることにも注意してください。この場合、

#if _MSC_VER > 1000 
#pragma once 
#endif 

、あなたは上記で説明の#defineを使用する必要はありません:それはバージョン10以上だ場合例えばVC++は、「一度に#pragma」を可能にします。

+4

先頭のアンダースコアを '_MY_LIB_H_'から削除する必要があります。 C++ 98の標準である17.4.3.1.2は次のように述べています。「二重アンダースコアを含む、またはアンダースコアで始まり大文字の後ろに続く各名前は、いずれの用途の実装にも予約されています。 –

+1

同様に、C99とC11の標準にも句があります(質問にはCとC++の両方がタグ付けされています)。 – dreamlax

7

コンパイル時に複数回インクルードされないように、ヘッダファイルにinclude guardsを入れる必要があります。

#ifndef LIB_H 
#define LIB_H 

// Actual header file code 

#endif 
関連する問題