C ++非直接包含场景

时间:2011-05-17 19:23:15

标签: c++

好的,我有这种情况。

一个名为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会被包含两次。是这样吗?如果是这样,如何解决?

7 个答案:

答案 0 :(得分:3)

查看您自己的头文件中的前两行。这些行一起确保C预处理器仅包含每个头文件一次。这是为C / C ++软件编写标题的标准方法。主系统头文件(如windows.h)执行相同(或类似的操作),以确保预处理器只看到一次文件。

答案 1 :(得分:3)

#windows.h应该(读:是)​​足够聪明,这不是问题。

  • 他们使用“标题保护”来确保多次包含 TU中的安全性,就像您在文件a.hb.h中所做的那样(尽管你应该为那些守卫挑选更好的名字......哦,他们目前能否轻易发生冲突!)。

  • 为了确保多个包含 TU(目前不是您的方案)的安全性,他们将自己限制为仅在标题中允许声明而不是定义文件。其余的将进入作为操作系统一部分的库二进制文件。 (事实上​​,除了模板/内联函数定义之外,你应该总是偏离标题中的定义)。

答案 2 :(得分:2)

应该不用担心,因为windows.h包含文件中有警卫。如果确实出现错误,请切换编译器版本或编译器。

答案 3 :(得分:2)

我99%肯定,windows.h已包含警卫,因此应该完全安全地将a.hb.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文件的内容。