C++非直接包含方案

C++ non-direct Inclusion Scenario

本文关键字:包含 方案 C++      更新时间:2023-10-16

好的,我有这种情况。

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

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

  • 他们使用"标头保护"来保证 TU 多个包含的安全性,就像您在文件a.hb.h中所做的那样(尽管您真的应该为这些保护选择更好的名称......哦,他们现在多么容易发生冲突!

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

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

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

Windows.h 不会多次被包含。

实际上,C/C++ 头文件采用通过 #ifdef 保护块保护包含的约定,如下所示:

#ifndef __WINDOWS_H__
#define __WINDOWS_H__
...
... <windows.h content>
...
#endif

因此实际上只包含一次

是的,但不用担心,因为 windows.h 的开头是:

#ifndef _WINDOWS_
#define _WINDOWS_

顺便说一句,您可能还想

#define WIN32_LEAN_AND_MEAN

在Windows包含之前,以排除一些更深奥的功能。

我 99% 确定,windows.h包含防护装置,因此将a.hb.h包含在一个文件中应该是完全安全的 - windows.h中的内容不会重复

这应该不是问题,因为像 Windows.h 这样的重要头文件也会在开头包含一个保护,例如

#ifndef _WINDOWS_H
#define _WINDOWS_H
//...code
#endif // _WINDOWS_H

因此,对于每个编译的代码模块,Windows.h头文件中的信息只会包含一次,即使标头重复多次,因为在第一次包含它之后,_WINDOWS_H被定义,因此守卫会导致预处理器跳过剩余Windows.h文件的内容。

相关文章: