好的,我有这种情况。
一个名为a的类,包括windows.h。
#ifndef a.h
#define a.h
#include <windows.h>
class a
{
};
#endif
一个名为b的类,包括windows.h。
#ifndef b.h
#define b.h
#include <windows.h>
class b
{
};
#endif
这样的主要课程。
#include "a.h"
#include "b.h"
MAIN STUFF
我想澄清的一点如下。
因为我将a和b都导入main,所以我担心windows.h会被包含两次。是这样吗?如果是这样,如何解决?
答案 0 :(得分:3)
查看您自己的头文件中的前两行。这些行一起确保C预处理器仅包含每个头文件一次。这是为C / C ++软件编写标题的标准方法。主系统头文件(如windows.h)执行相同(或类似的操作),以确保预处理器只看到一次文件。
答案 1 :(得分:3)
#windows.h
应该(读:是)足够聪明,这不是问题。
他们使用“标题保护”来确保多次包含在 TU中的安全性,就像您在文件a.h
和b.h
中所做的那样(尽管你应该为那些守卫挑选更好的名字......哦,他们目前能否轻易发生冲突!)。
为了确保多个包含跨 TU(目前不是您的方案)的安全性,他们将自己限制为仅在标题中允许声明而不是定义文件。其余的将进入作为操作系统一部分的库二进制文件。 (事实上,除了模板/内联函数定义之外,你应该总是偏离标题中的定义)。
答案 2 :(得分:2)
应该不用担心,因为windows.h
包含文件中有警卫。如果确实出现错误,请切换编译器版本或编译器。
答案 3 :(得分:2)
我99%肯定,windows.h
已包含警卫,因此应该完全安全地将a.h
和b.h
包含在一个文件中 - windows.h
中的内容不会重复
答案 4 :(得分:2)
windows.h不会被包含多次。
实际上,c / c ++头文件采用了#ifdef保护块来保护包含的惯例,如下所示:#ifndef __WINDOWS_H__
#define __WINDOWS_H__
...
... <windows.h content>
...
#endif
这样实际上只包含一次
答案 5 :(得分:2)
是的,但不用担心因为windows.h的开头是:
#ifndef _WINDOWS_
#define _WINDOWS_
顺便说一下,你可能还想
#define WIN32_LEAN_AND_MEAN
在Windows包括之前,要保留一些更深奥的功能。
答案 6 :(得分:1)
这不应该是一个问题,因为像Windows.h
这样重要的头文件也会在开头包含一个警卫
#ifndef _WINDOWS_H
#define _WINDOWS_H
//...code
#endif // _WINDOWS_H
因此Windows.h
头文件中的信息只会为每个编译的代码模块包含一次,即使标题重复多次,因为在第一次包含它之后,_WINDOWS_H
被定义因此,警卫会使预处理器跳过剩余的Windows.h
文件的内容。