为何标记粘贴运算符(##)无法用于拼接两个字符串?
为什么标记粘贴运算符(##)无法拼接两个字符串?
C语言里的标记粘贴运算符(##),设计目的是合并两个预处理标记(比如标识符、数字、关键字这类独立的语法单元),生成一个新的合法预处理标记。但字符串字面量本身已经是一个完整的预处理标记,用##去拼接两个字符串标记时,会试图把"hello"和"world"强行合并成一个新标记,但合并后的结果"hello""world"并不是合法的预处理标记——合法的字符串标记要求内容被一对双引号包裹,而不是两对。
你给出的错误示例代码:
#include <stdio.h> #define MESSAGE "hello"##"world" int main() { printf(MESSAGE); }
对应的错误提示:
错误:粘贴""hello""和""world""无法生成有效的预处理标记
其实C语言本身支持字符串字面量的自动拼接,根本不需要用##。正确的写法直接去掉##即可:
#include <stdio.h> #define MESSAGE "hello""world" int main() { printf(MESSAGE); }
这段代码会正常编译并输出helloworld,因为编译器会自动把相邻的字符串字面量合并成一个。当然你也可以直接写成#define MESSAGE "helloworld",效果完全一样。
内容的提问来源于stack exchange,提问作者İlker Deveci
相关产品推荐
相关产品推荐

