我有A.cpp
和B.cpp
,其中都包含头文件header.h
。
后来A.cpp
和B.cpp
都包含在main.cpp
中。
当编译main.cpp
时,如果头文件header.h
已被包含两次,则会导致错误。
如何解决这个问题?
答案 0 :(得分:4)
您应该在
中包围您的标题文件#ifndef MYFILE_H
#define MYFILE_H
// Contents of your file
#endif
这些被称为包括警卫。
第二点:你不应该包括.cpp文件,只包括.h文件。
答案 1 :(得分:2)
使用include guards。在标题中,例如:
// Header.h
#ifndef HEADER_H_
#define HEADER_H_
// code from original header.h
#endif
并且不要在其他.cpp
文件中包含.cpp
个文件。仅包含必要的标题。
编辑如果头文件来自第三方库,并且没有包含警卫,我会非常怀疑该库。我会放弃它。但是,您可以创建自己的标题,包括include guard中的库标题:
// FixedHeader.h
#ifndef HEADER_H_
#define HEADER_H_
#include "header.h"
#endif
然后#include "FixedHeader.h"
。但我会严肃地放弃图书馆。
答案 2 :(得分:2)
如果您无法修改头文件以包含警卫,则有3种可能的解决方案(从最好到最差):
1不要使用那些垃圾 2使用包装器my_header.h
#ifndef MY_HEADER_H
#define MY_HEADER_H
#include <header.h>
#endif // MY_HEADER_H
在代码中包含my_header.h而不是header.h
3在.cpp文件中使用警卫
#ifndef HEADER_H
#define HEADER_H
#include <header.h>
#endif // HEADER_H
你必须保持一致并且在任何地方使用相同的警卫(这就是解决方案3的原因)