C++ C++;非直接包容情景

C++ 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会被包含两次。是这样吗?如果是,如何修复?请查看您自己的

好的,我有这个场景

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

请查看您自己的头文件中的前两行。这些行一起确保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