在许多 C 和 C++ 文件中,我看到过这样的宏:
#ifdef X
#undef X // no statements in between
#endif
我觉得,简单地写下就足够了:
#undef X
如果未定义宏X
,则#undef
应该无效。
如果我只想取消定义宏,可以独立放置吗?无论如何,这会使编码实践变得糟糕吗?#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 没有当前定义的宏。
我想如果它已经是普遍的做法,就没有必要在理由中指出它了。
综上所述,在现代代码中这不是必需的,但也没有真正的伤害。
Kernighan 和 Ritchie(第 2 版)同意你的观点。
编辑:引用来源(第 A12.3 节):
窗体的控制线
# undef
标识符导致标识符的预处理器定义被遗忘。如果应用于
#undef
未知标识符并没有错误。