首页 > 解决方案 > 预处理标记:'- -' vs. '--'

问题描述

为什么 (GCC) 预处理器在以下示例中创建两个令牌- -B而不是一个?--B前者应该正确而不是后者的逻辑是什么?

#define A -B
-A

输出依据gcc -E

- -B

毕竟--是一个有效的操作符,所以理论上也是一个有效的token。

这是特定于 GCC 预处理器还是遵循 C 标准?

标签: cmacrosc-preprocessor

解决方案


预处理器处理令牌,而不是字符串。没有宏替换##不能创建新的标记,因此,如果预处理器输出到文本文件而不是直接进入编译器,预处理器会插入空格,以便输出的文本文件可以再次用作 C 输入而不改变语义。

空间插入似乎不在标准中,但是标准将预处理器描述为处理标记并将其输出提供给适当的编译器,而不是文本文件。


推荐阅读