在#undef之前我们什么时候需要#ifdef?

时间:2012-02-01 03:56:22

标签: c++ c coding-style macros undef

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

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

我觉得,只需写下来就足够了:

#undef X

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

如果我只想取消定义宏,那么

ok 是否可以放置独立的#undef?这是否会使编码练习变得糟糕?

3 个答案:

答案 0 :(得分:21)

见ISO C99 6.10.3.5第2段。

  

表单

的预处理指令
# undef identifier new-line
     

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

即使Visual C++ 6(因标准不合规而臭名昭着)也允许这样做:

  

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

答案 1 :(得分:10)

我确定这是历史的一件神器。 As mentioned in jdigital's answer,第二版K& R说

  

将#undef应用于未知标识符并不是错误的。

然而,这句话不是1978年版。我很确定如果您尝试#undef未定义的宏,那么预标准编译器通常会抛出错误。

此外,ANSI C Rationale says

  

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

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

所有这一切,在现代代码中没有必要,但它也没有真正受到伤害。

答案 2 :(得分:8)

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

编辑:来自消息来源(A12.3节):

  

表单

的控制行      

# undef 标识符

     

导致标识符的预处理程序定义被遗忘。如果将#undef应用于未知标识符并不是错误的。