【问题标题】:C++ #ifndef TOKEN #define TOKENC++ #ifndef 令牌 #define 令牌
【发布时间】:2014-12-08 02:42:58
【问题描述】:

在一些情况下,我看到了如下预处理器代码:

#ifndef TOKEN
#define TOKEN
#endif

对我来说,似乎在这种情况下(我知道它在包裹自身以外的物品时会被使用(包括为仍在回答的人提供警卫)),检查 TOKEN 是否已经是多余的在定义它之前定义它。如果我只是#define 它而不进行检查,结果是一样的。

这有共同的原因吗?编译时间?保留块以供将来添加?

谢谢。

【问题讨论】:

    标签: c++ c-preprocessor ifndef


    【解决方案1】:

    您的确切示例通常用于多重包含保护(包括保护)。在大型代码库中,您可能有一个包含在多个位置的 h 文件,并且此构造用于避免重新定义错误。在现代编译器中,它可以替换为

    #pragma once
    

    在文件的顶部。

    【讨论】:

      【解决方案2】:

      这是包括警卫。

      在 C 和 C++ 编程语言中,#include 保护,有时称为宏保护,是使用 to avoid the problem of double inclusion when dealing with the include directive 的特殊构造。向头文件添加#include 保护是使该文件具有幂等性的一种方法。

      详情请查看下方:

      http://en.wikipedia.org/wiki/Include_guard

      C++ - header guards

      【讨论】:

        【解决方案3】:

        因为否则您可能会收到宏重新定义警告。例如,我们有一些第三方 dll 的头文件如下所示。

        #define PI 3.14
        

        由于这些是在第三方标头中定义的,我们无法控制它们,也无法删除或重命名它们。如果我们也尝试自己定义 Pi,我们会收到一个宏重新定义警告。所以你有两个选择,

        1) 使用它们的宏,注意不要重定义

        #ifndef PI
        #define PI 3.14
        #endif
        

        2) 删除他们的定义,然后定义你自己的

        #ifdef PI
        #undef PI
        #endif
        #define PI 3.14
        

        【讨论】:

        • 有道理,谢谢。我没有收到任何错误,因为我没有想过要为任何一个#define 添加值。我的心情轻松了。 :)
        【解决方案4】:

        你可以用宏做的一件很酷的事情是在命令行上定义它们,对于我经常使用的 gcc

        gcc source.c -DMY_PI=6.5
        

        然后在我的代码中

        #ifndef MY_PI
        #define MY_PI 3.1415
        #endif
        

        这使我可以使用 MY_PI 的许多不同定义来编译相同的代码,但也允许使用默认值。

        【讨论】:

        • 当然,我真的很喜欢将 PI 设置为 6.5,...?
        • 我一直不确定 GCC 到底是什么,但很高兴知道,我会记住这一点。这就是 UE4 编辑器在为某些目标/设置构建引擎/游戏时会做的事情,对吧?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 2016-02-17
        • 2019-11-11
        • 2017-04-15
        • 2016-08-18
        • 2019-12-08
        相关资源
        最近更新 更多