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