为什么(GCC)预处理器在以下示例中创建了两个令牌- -B
而不是一个--B
?前者应该是正确的而不是后者的逻辑是什么?
#define A -B
-A
根据gcc -E
输出:
- -B
毕竟,--
是一个有效的运算符,理论上也是一个有效的标记。
这是否特定于GCC预处理器,还是遵循C标准?
答案 0 :(得分:3)
预处理器可以处理令牌,而不是字符串。没有##
的宏替换不能创建新的令牌,因此,如果预处理器输出转到文本文件而不是直接进入编译器,则预处理器会插入空格,以便输出的文本文件可以再次用作C输入而不会更改语义。
空间插入似乎不在标准中,但是标准将预处理器描述为处理令牌并将其输出提供给编译器,而不是文本文件。
答案 1 :(得分:1)
关注白色空间插入问题。
宏A
被定义为预处理令牌-
和B
的序列。
当编译器解析源代码-A
的片段时,它会生成2个令牌-
和A
。 A
作为预处理阶段的一部分进行了扩展,并且令牌转换为C令牌:-
,-
和B
。
如果B
本身被定义为宏(#define B 4
),A
会扩展为-
,-
,4
,被解析为一个表达式,其值为4
,其值为int
。
gcc -E
生成文字。要使文本转换回与原始源代码相同的标记序列,需要在两个-
标记之间插入一个空格,以防止--
被解析为单个标记。