在某些情况下,我见过如下预处理器代码:
#ifndef TOKEN
#define TOKEN
#endif
对我来说,似乎在这种情况下(我知道它在包裹自己以外的物品时使用(包括包括仍在回答的人的警卫)),在定义之前检查 TOKEN 是否已经定义是多余的它。如果我只是#define 它,没有检查,结果是一样的。
这有共同的原因吗?编译时间?保留块以供将来添加?
谢谢。
在某些情况下,我见过如下预处理器代码:
#ifndef TOKEN
#define TOKEN
#endif
对我来说,似乎在这种情况下(我知道它在包裹自己以外的物品时使用(包括包括仍在回答的人的警卫)),在定义之前检查 TOKEN 是否已经定义是多余的它。如果我只是#define 它,没有检查,结果是一样的。
这有共同的原因吗?编译时间?保留块以供将来添加?
谢谢。
因为否则您可能会收到宏重新定义警告。例如,我们有一些第三方 dll 的头文件如下所示。
#define PI 3.14
由于这些是在第三方标头中定义的,因此我们无法控制它们,也无法删除或重命名它们。如果我们也尝试自己定义 Pi,我们会收到一个宏重新定义警告。所以你有两个选择,
1)使用他们的宏,并防止重新定义
#ifndef PI
#define PI 3.14
#endif
2)删除他们的定义,然后定义你自己的
#ifdef PI
#undef PI
#endif
#define PI 3.14
您可以使用宏做的一件很酷的事情是在命令行上定义它们,对于我经常使用的 gcc
gcc source.c -DMY_PI=6.5
然后在我的代码中
#ifndef MY_PI
#define MY_PI 3.1415
#endif
这允许我使用 MY_PI 的许多不同定义来编译相同的代码,但也允许使用默认值。
这是包括后卫。
在 C 和 C++ 编程语言中,#include 保护,有时称为宏保护,是使用的特定构造to avoid the problem of double inclusion when dealing with the include directive
。在头文件中添加#include 保护是使该文件具有幂等性的一种方法。
请查看以下详细信息:
您的确切示例通常用于多重包含保护(包括保护)。在大型代码库中,您可能有一个包含在多个位置的 h 文件,并且此构造用于避免重新定义错误。在现代编译器中,它可以替换为
#pragma once
在文件的顶部。