如何获取C预处理器的有效标记分隔符列表?
C预处理器标记分隔符问题解答
测试案例
测试代码
#define foo 123 foo _foo ->foo &foo
预处理输出
执行gcc -E命令(仅预处理,不编译)后,输出如下:
123 _foo ->123 &123
结论
从输出结果可以明确:_foo没有被拆分替换,说明下划线_不是C预处理器的标记分隔符,它属于标识符的合法组成部分,_foo是一个完整的标记。
标记分隔符获取渠道
最权威的来源是C语言官方标准(如C99、C11、C17/C18),其中明确规定了预处理器的标记拆分规则及有效分隔符类型:
- 空白类分隔符:空格、制表符、换行符、换页符、垂直制表符
- 注释:
/*...*/块注释和//单行注释会被预处理器视为空白,起到分隔作用 - 运算符/标点符号:例如
->、&、+、(、)、;、,等,当这类符号与标识符、数字等非符号类标记相邻时,会成为标记的分隔边界 - 特殊说明:字符串字面量、字符常量内部的字符不会被当作分隔符处理
此外,GCC的官方文档也会说明其对C标准的实现细节,但优先参考C语言官方标准是最准确的。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

