C++ C++;非直接包容情景
好的,我有这个场景 一个名为A的类,其中包括windows.hC++ C++;非直接包容情景,c++,C++,好的,我有这个场景 一个名为A的类,其中包括windows.h #ifndef a.h #define a.h #include <windows.h> class a { }; #endif #ifndef b.h #define b.h #include <windows.h> class b { }; #endif 我想澄清的是以下几点 因为我将a和b都导入到main中,所以我担心windows.h会被包含两次。是这样吗?如果是,如何修复?请查看您自己的
#ifndef a.h
#define a.h
#include <windows.h>
class a
{
};
#endif
#ifndef b.h
#define b.h
#include <windows.h>
class b
{
};
#endif
我想澄清的是以下几点
因为我将a和b都导入到main中,所以我担心windows.h会被包含两次。是这样吗?如果是,如何修复?请查看您自己的头文件中的前两行。这些行一起确保C预处理器只包含每个头文件一次。这是为C/C++软件编写头文件的标准方式。主系统头,如windows.h,也会执行相同的操作(或类似操作),以确保预处理器只查看一次文件。
#windows.h
应该(读取:是)足够聪明,这样就不会出现问题
- 他们使用“标题保护”来保证TU中的多个包含的安全性,就像你在文件
和a.h
中所做的那样(尽管你真的应该为这些保护选择更好的名称…哦,现在它们很容易发生冲突!)b.h
- 为了保证跨tu的多个包含的安全性(目前不是您的场景),它们限制自己只允许在头文件中声明,而不允许定义。其余的将放在作为操作系统一部分的库二进制文件中。(而且,事实上,除了模板/内联函数定义之外,您应该始终避免在标题中定义内容)
- 不必担心,因为
windows.h
include文件中有防护装置。如果确实出现错误,请切换编译器版本或编译器。我99%确定,windows.h
已经包含了防护,因此,将a.h
和b.h
包含在一个文件中应该是完全安全的,windows.h
中的内容不会被复制,这不应该是一个问题,因为像windows.h
这样的重要头文件在开始时也会包含一个保护,如
#ifndef _WINDOWS_H
#define _WINDOWS_H
//...code
#endif // _WINDOWS_H
因此,对于每个编译的代码模块,
Windows.h
头文件中的信息只包含一次,即使头文件重复多次,因为在第一次包含后,定义了\u Windows\u h
,因此,防护会导致预处理器跳过剩余的Windows.h
文件的内容。Windows.h不会被包含多次
实际上,c/c++头文件采用了通过#ifdef保护块保护包含的约定,如下所示:
#ifndef __WINDOWS_H__
#define __WINDOWS_H__
...
... <windows.h content>
...
#endif
\ifndef\uuuh__
#定义窗口__
...
...
...
#恩迪夫
因此,实际上只包含一次是的,但不必担心,因为windows的开始。h是:
#ifndef _WINDOWS_
#define _WINDOWS_
顺便说一句,你可能也想
#define WIN32_LEAN_AND_MEAN
在windows包含之前,将一些更深奥的功能排除在外。将它们包含在各自的源文件中。类不包含任何内容。@Mahesh。是的,类a和类be都需要windows.h,因为它们使用依赖于windows的函数。h.@Mahesh:因为他的头需要访问WinAPI中的一些符号…?@Mahesh:这是一件可怕的事情。如果文件需要WinAPI符号,则应包含WinAPI头。它绝对不应该依赖于包含它的其他东西,因为它以前也包含了WinAPI头。标题应该是自给自足的。(还有,什么问题?这里没有问题。)“他们”=谁编写了
windows.h
,那么你是建议我应该#包含在cpp文件而不是h文件中?我没有意识到这很重要。@user440297:绝对没有。正如我的第一句话所说,“这不是问题”。让代码保持原样。对不起,如果不清楚的话……啊,谢谢。马赫什的评论中有一些挥之不去的困惑,但现在一切都清楚了。如果你只有99%的把握,那么它只有99%的安全性嗯,我面前没有windows.h
,但如果不是这样的话,我会非常、完全、非常惊讶(:@Kiril:当然,但考虑到一些“完全安全”的东西,如果你只有99%的把握是糟糕的编程实践,不?对,我添加了“应该”,好(:。但如果不是,这意味着“windows”当你在你的项目中包含<代码> Windows .H./C>时,触发触发(“任何语言都会让你自己开枪,C++会提供枪,子弹,给你一杯饮料,让你的手稳定,安装望远镜瞄准镜,并在你的脚上画一个大目标”。-好的,你应该经常检查你使用的所有东西,对吧。但是你是想告诉我,你总是100%肯定你在代码中写的每一行吗?因为我对此表示怀疑。(:
#define WIN32_LEAN_AND_MEAN