预处理标记:'- -' 与 '--'

Preprocessing Tokens: '- -' vs. '--'

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

#define A -B
-A

根据gcc -E输出:

- -B

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

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

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

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

关注白色space插入缺失问题

A 定义为预处理标记序列 -B

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

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

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