C ++ #ifndef TOKEN #define TOKEN

时间:2014-10-13 13:49:16

标签: c++ c-preprocessor ifndef

在某些情况下,我见过预处理器代码,如下所示:

#ifndef TOKEN
#define TOKEN
#endif

对我来说,似乎在这种情况下(我知道它被包裹在除了它自己以外的其他物品时使用(包括那些仍在回答的人的防护)),检查TOKEN是否已经是多余的在定义它之前定义。如果我只是#define它,没有检查,结果是一样的。

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

感谢。

4 个答案:

答案 0 :(得分:4)

因为您可能会收到宏重新定义警告。例如,我们有一些第三方dll的标题包含以下内容。

#define PI 3.14

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

1)使用他们的宏,并防止重新定义

#ifndef PI
#define PI 3.14
#endif

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

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

答案 1 :(得分:3)

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

gcc source.c -DMY_PI=6.5

然后在我的代码中

#ifndef MY_PI
#define MY_PI 3.1415
#endif

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

答案 2 :(得分:0)

这是包括警卫。

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

请查看以下详细信息:

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

C++ - header guards

答案 3 :(得分:0)

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

#pragma once

位于文件顶部。