这个问题在这里已经有了答案:
In which step of compilation are comments removed?
(2 个回答)
3年前关闭。
考虑这个(可怕的,可怕的,不好的,非常糟糕的)代码结构:
#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);
显然,这对于可移植的代码库来说是一件坏事。
我的问题:预处理器应该如何处理?先删除注释,还是先展开宏?
最佳答案
可惜原版ANSI C Specification明确排除第 4 节中的任何预处理器功能(“本规范仅描述 C 语言。它没有规定库或预处理器。”)。
C99 specification不过,明确地处理了这一点。注释在“翻译阶段”中替换为单个空格,这发生在预处理指令解析之前。 (详情见第 6.10 节)。
VC++和 GNU C Compiler两者都遵循这种范式 - 如果其他编译器较旧,则可能不兼容,但如果它符合 C99,则应该是安全的。
关于c - C 预处理器是先删除注释还是先扩展宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41120683/