C++非直接包含方案
C++ non-direct Inclusion Scenario
好的,我有这种情况。
一个名为 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.h
和b.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.h
和b.h
包含在一个文件中应该是完全安全的 - windows.h
中的内容不会重复
这应该不是问题,因为像 Windows.h
这样的重要头文件也会在开头包含一个保护,例如
#ifndef _WINDOWS_H
#define _WINDOWS_H
//...code
#endif // _WINDOWS_H
因此,对于每个编译的代码模块,Windows.h
头文件中的信息只会包含一次,即使标头重复多次,因为在第一次包含它之后,_WINDOWS_H
被定义,因此守卫会导致预处理器跳过剩余Windows.h
文件的内容。
- 如何使用 CMake 获得包含所有项目的 VS 解决方案和单个项目的解决方案
- 哪些有效的解决方案可以检查Arraya是否包含Arrayb的所有元素
- <thread> 在 C++/CLI 代码中包含的代码中使用。寻找更好的解决方案
- 正在(在构造函数中)将其包含一个不良设计的指针传递,如果是的,则解决方案是什么
- 在多个解决方案中包含C++ mfc 对象库
- 在Visual studio-LNK2001中的同一解决方案中包含来自单独项目的文件
- 尝试在与我的 EXE 项目相同的解决方案中引用 DLL 项目时,出现错误"无法打开包含文件:"iostream"
- 在CMake中包含Visual Studio解决方案
- 需要包含运行任务时间的 2D 矩阵的最佳解决方案
- Visual Studio:在两个项目的解决方案中包含.h或.cpp
- 如何在同一解决方案中包含其他项目的头文件
- 如何将CMake包含和库添加到Visual Studio解决方案中
- 拥有一个包含MFC项目和用于单元测试的控制台应用程序的解决方案
- MS Blend 3&4可以打开包含混合代码的解决方案吗?
- TeamCity使用c++项目构建VS2012解决方案,其中包含设备驱动程序无法清理目录
- 在windows上包含sys/times.h的替代方案是什么
- LNK2019当包含asio头时,使用cmake生成解决方案
- 如何找出哪些包含的文件不是当前VC++解决方案的一部分
- C++非直接包含方案
- 如何处理和包含头文件和库,以便在不同的机器上构建Visual Studio 2010解决方案