0

我有A.cpp并且B.cpp两者都包含头文件header.h

后来两者A.cppB.cpp都包含在main.cpp.

这在编译时会导致错误,main.cpp说头文件header.h已被包含两次。

如何解决这个问题?

4

3 回答 3

4

您应该将头文件包围在

#ifndef MYFILE_H
#define MYFILE_H

// Contents of your file

#endif

这些被称为包括警卫。

第二点:你不应该包含 .cpp 文件,只包含 .h 文件。

于 2013-02-23T20:38:27.917 回答
2

使用包括警卫。在您的标题中,例如:

// 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"。但我会放弃图书馆,认真的。

于 2013-02-23T20:37:55.753 回答
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 的原因)

于 2013-02-23T20:52:07.913 回答