【发布时间】:2010-12-03 09:50:40
【问题描述】:
考虑一下这个(可怕的、糟糕的、不好的、非常糟糕的)代码结构:
#define foo(x) // commented out debugging code
// Misformatted to not obscure the point
if (a)
foo(a);
bar(a);
我已经看到两个编译器的预处理器在这段代码上产生了不同的结果:
if (a)
bar(a);
和
if (a)
;
bar(a);
显然,这对于可移植代码库来说是一件坏事。
我的问题:预处理器应该对此做什么?先去掉cmets,还是先展开宏?
【问题讨论】:
-
好问题 - 让我努力追踪实际的真实信息 :)
-
仅供参考,使用“#define foo(x) ##”来做一个更安全的空白宏....(或者是###?:/)
-
顺便说一句-您使用的编译器在您的第一个示例中表现如何?我很确定它会破坏很多代码——即使在#define 中只使用/* */ cmets 可能很聪明,我的印象是我已经看到了很多'//' cmets 使用。
-
会不会是预处理器不理解
//cmets,但编译器可以?请记住,最初,C 应该只理解/* */cmets,而//是 C++ 扩展。我认为 C 只用 C99 拾取了//。 (我的历史记录在这里正确吗?)。事实上,无论你使用什么编译器,我都很想知道它是如何处理/*
标签: c comments c-preprocessor c99