预处理令牌:' - - '与' - '

时间:2018-05-30 13:27:19

标签: c macros c-preprocessor

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

#define A -B
-A

根据gcc -E输出:

- -B

毕竟,--是一个有效的运算符,理论上也是一个有效的标记。

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

关注白色空间插入问题。

A被定义为预处理令牌-B的序列。

当编译器解析源代码-A的片段时,它会生成2个令牌-AA作为预处理阶段的一部分进行了扩展,并且令牌转换为C令牌:--B

如果B本身被定义为宏(#define B 4),A会扩展为--4,被解析为一个表达式,其值为4,其值为int

gcc -E生成文字。要使文本转换回与原始源代码相同的标记序列,需要在两个-标记之间插入一个空格,以防止--被解析为单个标记。