c - C 预处理器是先删除注释还是先扩展宏?

标签 c comments c-preprocessor c99

这个问题在这里已经有了答案:





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/

相关文章:

c++ - 这怎么可能呢?

确认数组的缓存对齐

c - const char * const 和 const char [] 有区别吗?

javascript - 我应该如何在 JavaScript 中注释对象结构?

c++ - 如何在预处理器时附加到 __FILE__ 并包含结果

c - 忽略或重新定义 GCC 标准预定义宏

c - 替换许多字符串常量的宏

python - 将 CSV 文件注释行保留在 pandas 中?

javascript - 显示默认文本的评论框文本区域在用户聚焦时消失

c++ - 在 C++ 编译器中是否有一种以字节为单位获取类型大小的标准化方法?