我们什么时候需要先#ifdef再#def
When do we need #ifdef before #undef?
在许多C和C++文件中,我看到过这样的宏:
#ifdef X
#undef X // no statements in between
#endif
我觉得,简单地写一下就足够了:
#undef X
如果没有定义宏X
,那么#undef
应该没有任何作用。
如果我只想取消定义宏,那么放置独立的#undef
是否可以?这是否会使编码实践变得糟糕?
参见ISO C99 6.10.3.5第2段。
表单的预处理指令
# undef identifier new-line
导致指定的标识符不再被定义为宏名称。如果指定的标识符当前未定义为宏名称。
即使是Visual C++6(它因不符合标准而臭名昭著)也允许这样做:
还可以将
#undef
指令应用于以前没有定义的标识符。这样可以确保标识符是未定义的。在#undef
语句中不执行宏替换。
我确信这是历史的产物。正如jdigital的回答中所提到的,K&R表示
将#undef应用于未知标识符并不是错误的。
然而,这句话没有出现在1978年的版本中。我敢肯定,如果您尝试#undef
一个未定义的宏,预标准编译器经常会抛出错误。
此外,ANSI C的基本原理是:
明确允许#undef没有当前定义的宏。
我想,如果这已经是普遍的做法,就没有必要在理由中指出它。
尽管如此,在现代代码中这是不必要的,但它也没有真正的伤害。
编辑:引用来源(第A12.3节):
形式的控制线
# undef
标识符导致忘记标识符的预处理器定义。如果没有错误,则将
#undef
应用于未知标识符。
相关文章:
- #ifdef和未声明的标识符
- C++ Macros #ifdef
- 在具有全局类型def的类中使用成员函数指针
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 这是 basic.def.odr 部分的缺陷吗?
- 更新 #ifdef 中的现有变量值?
- 在使用 Clang 编译 DLL 时指定 DEF 文件
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 函数模板签名中忽略的成员类型def 的访问说明符
- 使用 #ifdef 时的多个定义
- 使用 [#define & #ifdef] 跨文件激活代码块
- 以下 OpenCV 源代码中是否存在错误?(#ifdef 没有 #else)
- 有C++标准库 ifdef 或 ifndef 预处理器指令吗?
- 删除unicode def后,无法将QString转换为TCHAR
- C++预处理器同时执行#ifdef和#ifndef
- C++ 如何在 def 文件中指定命名空间
- 如何在 LLVM 后端的机器级别找到 def-use 链
- SFINAE-based ifdef
- 我们可以在INI文件中使用 #ifdef 宏,或者我们如何限制INI文件中写入的设置的编译?
- 我们什么时候需要先#ifdef再#def