在许多C和C ++文件中,我见过这样的宏:
#ifdef X
#undef X // no statements in between
#endif
我觉得,只需写下来就足够了:
#undef X
如果未定义宏X
,则#undef
应无效。
ok 是否可以放置独立的#undef
?这是否会使编码练习变得糟糕?
答案 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
未定义的宏,那么预标准编译器通常会抛出错误。
明确允许#undef没有当前定义的宏。
我想如果它已经是普遍的做法,就没有必要在理由中说出来。
所有这一切,在现代代码中没有必要,但它也没有真正受到伤害。
答案 2 :(得分:8)
Kernighan和Ritchie(第2版)同意你的观点。
编辑:来自消息来源(A12.3节):
表单
的控制行
# undef
标识符导致标识符的预处理程序定义被遗忘。如果将
#undef
应用于未知标识符并不是错误的。