C语言宏定义中如何在#字符串化操作的参数内包含转义序列
C语言STR宏构造含转义单引号字符串的解决方案
报错原因
你编写的char* str1 = STR(\');无法正常工作,核心原因是C预处理器的词法分析规则:
预处理器处理宏参数时会先做词法拆分,你写的\'会被识别为不完整的字符常量(缺少结束的配对单引号),还没到执行#x字符串化的步骤就会直接触发语法错误。
可行方案(无需修改原有STR宏定义)
方案1:使用ASCII转义序列(最便捷)
单引号的ASCII码十进制为39,对应八进制转义\047、十六进制转义\x27,直接传入宏即可:
#define STR(x) #x char* str1 = STR(\047);
预处理后会生成等价于"\'"的字符串"\047",运行时得到的内容完全相同,仅源代码字面量写法有区别。
方案2:嵌套宏展开生成显式\'字面量
如果你需要最终生成的字符串字面量中直接包含\'写法,可以加一层中转宏绕开预处理器的词法检查:
#define STR(x) #x // 中转宏用于先展开单引号,再传给STR做字符串化 #define EXPAND_STR(x) STR(x) #define SINGLE_QUOTE ' char* str1 = EXPAND_STR(\SINGLE_QUOTE);
预处理器会先把SINGLE_QUOTE展开为单引号,再执行字符串化操作,最终生成的代码就是char* str1 = "\'";,完全符合需求。
内容的提问来源于stack exchange,提问作者FUKUAN WANG
相关产品推荐
相关产品推荐

