多个包含头文件

Multiple inclusions of header files

本文关键字:文件 包含头      更新时间:2023-10-16

我有A.cppB.cpp,它们都包含头文件header.h

后来,A.cppB.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文件。仅包含必要的标头。

编辑 如果头文件来自第三方库,并且没有包含保护,我会非常怀疑该库。我会放弃它。但是,您可以创建自己的标头,包括包含保护中的库标头:

// 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(