C++ #ifndef TOKEN #define TOKEN
C++ #ifndef TOKEN #define TOKEN
在一些情况下,我看到了如下预处理器代码:
#ifndef TOKEN
#define TOKEN
#endif
对我来说,在这种情况下(我知道它在包裹自己以外的物品时的用途(包括那些仍在回答的人的警卫)),在定义TOKEN之前检查它是否已经定义是多余的。如果我只是#define它,没有检查,结果是一样的。
这有共同的原因吗?编译时间?是否保留块以备将来添加?
谢谢。
因为否则可能会收到宏重新定义警告。例如,我们有一些第三方dll,它们的标头包含以下内容。
#define PI 3.14
由于这些是在第三方标头中定义的,我们无法控制它们,也无法删除或重命名它们。如果我们也试图自己定义圆周率,我们会得到一个宏观的重新定义警告。所以你有两个选择,
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定义的相同代码,但也允许使用默认值。
您的确切示例通常用于多重包含保护(include-guard)。在大型代码库中,您可能有一个包含在多个点中的h文件,此构造用于避免重新定义错误。在现代编译器中,它可以用代替
#pragma once
位于文件顶部。
这是include-guard。
在C和C++编程语言中,#include保护(有时称为宏保护)是使用to avoid the problem of double inclusion when dealing with the include directive
的一种特殊构造。在头文件中添加#include-guard是使该文件幂等的一种方法。
请查看下面的详细信息:
http://en.wikipedia.org/wiki/Include_guard
C++-标头保护
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- Arduino无法编译名为SP:"Expected ')' before '(' token"的变量
- 为什么我的功能在使用 goto 时会给我带来"expected primary-expression before '}' token"?
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- c中 #define 的不足
- 使用 [#define & #ifdef] 跨文件激活代码块
- 如何避免#define语法的变量重新声明
- 使用结构和数组时的"expected primary expression before '.' token"
- C++ #ifndef TOKEN #define TOKEN