私が持っているA.cpp
とB.cpp
両方にヘッダーファイルが含まれていますheader.h
。
その後、A.cpp
との両方B.cpp
が に含まれますmain.cpp
。
main.cpp
をコンパイルすると、ヘッダー ファイルheader.h
が 2 回インクルードされているというエラーが発生します。
これを解決するには?
私が持っているA.cpp
とB.cpp
両方にヘッダーファイルが含まれていますheader.h
。
その後、A.cpp
との両方B.cpp
が に含まれますmain.cpp
。
main.cpp
をコンパイルすると、ヘッダー ファイルheader.h
が 2 回インクルードされているというエラーが発生します。
これを解決するには?
ヘッダーファイルをで囲む必要があります
#ifndef MYFILE_H
#define MYFILE_H
// Contents of your file
#endif
これらはインクルードガードと呼ばれます。
2番目のポイント:.cppファイルを含めるのではなく、.hファイルのみを含める必要があります。
インクルードガードを使用します。ヘッダーで、たとえば:
// Header.h
#ifndef HEADER_H_
#define HEADER_H_
// code from original header.h
#endif
.cpp
また、他のファイルにファイルを含めないでください.cpp
。必要なヘッダーのみを含めます。
編集ヘッダーファイルがサードパーティのライブラリからのものであり、インクルードガードがない場合、私はそのライブラリを非常に疑っています。私はそれを落とします。ただし、インクルードガードのライブラリヘッダーを含め、独自のヘッダーを作成できます。
// FixedHeader.h
#ifndef HEADER_H_
#define HEADER_H_
#include "header.h"
#endif
次に#include "FixedHeader.h"
。しかし、私は真剣に図書館を落とすでしょう。
ヘッダー ファイルを変更してガードを含めることができない場合は、次の 3 つの解決策が考えられます (最良のものから悪いものへと並べ替えられています)。
1 そのゴミは使わないでください。
2 ラッパー my_header.h を使用する
#ifndef MY_HEADER_H
#define MY_HEADER_H
#include <header.h>
#endif // MY_HEADER_H
コードに header.h の代わりに my_header.h を含めます
3 .cpp ファイルでガードを使用する
#ifndef HEADER_H
#define HEADER_H
#include <header.h>
#endif // HEADER_H
ただし、一貫性を保つ必要があり、どこでも同じガードを使用する必要があります (それがソリューション 3 である理由です)