我们什么时候需要先#ifdef再#def

When do we need #ifdef before #undef?

本文关键字:#ifdef #def 什么时候 我们      更新时间:2023-10-16

在许多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(第二版)同意您的观点。

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

形式的控制线

# undef标识符

导致忘记标识符的预处理器定义。如果没有错误,则将#undef应用于未知标识符。