C++ 头文件的多个包含项

C++ 头文件的多个包含项,c++,C++,我有A.cpp和B.cpp,它们都包含头文件header.h 后来A.cpp和B.cpp都包含在main.cpp中 这会在编译main.cpp时导致错误,说明头文件header.h已包含两次 如何解决这个问题?使用。在标题中,例如: // Header.h #ifndef HEADER_H_ #define HEADER_H_ // code from original header.h #endif 并且不要将.cpp文件包含在其他.cpp文件中。仅包括必要的标题 编辑如果头文件来自第三

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

后来
A.cpp
B.cpp
都包含在
main.cpp

这会在编译
main.cpp
时导致错误,说明头文件
header.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
然后
#包括“FixedHeader.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

然后
#包括“FixedHeader.h”
。但是我会严肃地放下这个库。

你应该把你的头文件放在

#ifndef MYFILE_H
#define MYFILE_H

// Contents of your file

#endif
这些被称为包括警卫


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

您应该将头文件放在

#ifndef MYFILE_H
#define MYFILE_H

// Contents of your file

#endif
这些被称为包括警卫


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

如果您无法修改头文件以包含卫士,则有3种可能的解决方案(从最好到最差排序):

1不要使用那些垃圾。
2使用包装器my_header.h

#ifndef MY_HEADER_H
#define MY_HEADER_H
#include <header.h>
#endif // MY_HEADER_H
\ifndef MY\u HEADER\u H
#定义我的标题
#包括
#endif//MY_HEADER\u H
在代码中包含my_header.h而不是header.h

3.在.cpp文件中使用保护

 #ifndef HEADER_H  
 #define HEADER_H  
 #include <header.h>  
 #endif // HEADER_H
#ifndef头
#定义标题
#包括
#endif//HEADER\u H

但是,您必须保持一致,并且在任何地方都使用相同的防护(这就是为什么它是解决方案3)

如果您无法修改头文件以包含防护,则有3种可能的解决方案(从最佳到最差排序):

1不要使用那些垃圾。
2使用包装器my_header.h

#ifndef MY_HEADER_H
#define MY_HEADER_H
#include <header.h>
#endif // MY_HEADER_H
\ifndef MY\u HEADER\u H
#定义我的标题
#包括
#endif//MY_HEADER\u H
在代码中包含my_header.h而不是header.h

3.在.cpp文件中使用保护

 #ifndef HEADER_H  
 #define HEADER_H  
 #include <header.h>  
 #endif // HEADER_H
#ifndef头
#定义标题
#包括
#endif//HEADER\u H

不过,你必须保持一致,在任何地方都使用相同的防护(这就是解决方案3的原因)

Google关于“包含防护”的术语。这不是问题,但你不应该包含
.cpp
文件。@KillianDS我知道。稍后,我确实计划将源代码移到cpp文件中,并将类定义包含在单独的头文件中。不要等到以后。谷歌搜索术语“include guard”。这不是问题,但你不应该包括
.cpp
文件。@KillianDS我知道。稍后,我确实计划将源文件移动到cpp文件中,并将类定义包含在单独的头文件中。不要等到以后。头文件来自库。所以我不能在那里增加头球后卫。我现在该怎么办?@RitwikG如果他们来自图书馆,他们应该已经有警卫了。如果他们不这样做,那就放弃图书馆,这是不好的!不过请注意,至少在Windows上,include-guard可以用
#pragma一次表达一次
之类的东西。头文件来自库。所以我不能在那里增加头球后卫。我现在该怎么办?@RitwikG如果他们来自图书馆,他们应该已经有警卫了。如果他们不这样做,那就放弃图书馆,这是不好的!不过请注意,至少在Windows上,include-guard可以用
#pragma一次表达一次
之类的东西。头文件来自库。所以我不能在那里增加头球后卫。我现在必须做什么?头文件不是强制性的,有.h扩展名,所以请改变你的建议,这可能会让一些新手程序员感到困惑。@RitwikG听起来像是“库”被彻底破坏了。我的建议是:放下那些废话,使用一些实际上可以称为库的东西。头文件来自库。所以我不能在那里增加头球后卫。我现在必须做什么?头文件不是强制性的,有.h扩展名,所以请改变你的建议,这可能会让一些新手程序员感到困惑。@RitwikG听起来像是“库”被彻底破坏了。我的建议是:扔掉那些废话,用一些实际上可以称为图书馆的东西。