我有A.cpp
并且B.cpp
两者都包含头文件header.h
。
后来两者A.cpp
和B.cpp
都包含在main.cpp
.
这在编译时会导致错误,main.cpp
说头文件header.h
已被包含两次。
如何解决这个问题?
我有A.cpp
并且B.cpp
两者都包含头文件header.h
。
后来两者A.cpp
和B.cpp
都包含在main.cpp
.
这在编译时会导致错误,main.cpp
说头文件header.h
已被包含两次。
如何解决这个问题?
您应该将头文件包围在
#ifndef MYFILE_H
#define MYFILE_H
// Contents of your file
#endif
这些被称为包括警卫。
第二点:你不应该包含 .cpp 文件,只包含 .h 文件。
使用包括警卫。在您的标题中,例如:
// Header.h
#ifndef HEADER_H_
#define HEADER_H_
// code from original header.h
#endif
并且不要.cpp
在其他文件中包含.cpp
文件。仅包括必要的标题。
编辑如果头文件来自第 3 方库,并且没有包含保护,我会非常怀疑该库。我会放弃它。但是,您可以制作自己的标头,包括包含保护中的库标头:
// 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
在代码中包含 my_header.h 而不是 header.h
3 在 .cpp 文件中使用警卫
#ifndef HEADER_H
#define HEADER_H
#include <header.h>
#endif // HEADER_H
不过,您必须保持一致并在任何地方使用相同的防护装置(这就是解决方案 3 的原因)