36

在许多 C 和 C++ 文件中,我看到过这样的宏:

#ifdef X
#undef X  // no statements in between
#endif

我觉得,简单地写下就足够了:

#undef X

如果未定义宏X,则#undef应该无效。

如果我只想取消定义宏,可以独立放置吗?无论如何,这会使编码实践变得糟糕吗?#undef

4

3 回答 3

25

参见 ISO C99 6.10.3.5 第 2 段。

形式的预处理指令

# undef identifier new-line

导致指定的标识符不再被定义为宏名称。如果指定的标识符当前未定义为宏名称,则忽略它。

甚至Visual C++ 6(因不符合标准而臭名昭著)也允许这样做:

您还可以将该#undef指令应用于没有先前定义的标识符。这确保了标识符是未定义的。宏替换不在#undef语句中执行。

于 2012-02-01T04:08:35.743 回答
11

我敢肯定这是历史的产物。正如 jdigital 的回答中提到的,第二版的 K&R 说

将#undef 应用于未知标识符并没有错误。

但是,1978 年版中没有这句话。我很确定如果您尝试#undef使用未定义的宏,预标准编译器通常会抛出错误。

此外,ANSI C 基本原理说

明确允许 #undef 没有当前定义的宏。

我想如果它已经是普遍的做法,就没有必要在理由中指出它了。

综上所述,在现代代码中这不是必需的,但也没有真正的伤害。

于 2012-02-01T05:10:38.353 回答
9

Kernighan 和 Ritchie(第 2 版)同意你的观点。

编辑:引用来源(第 A12.3 节):

窗体的控制线

# undef 标识符

导致标识符的预处理器定义被遗忘。如果应用于#undef未知标识符并没有错误。

于 2012-02-01T04:03:31.807 回答