如何在C语言中通过宏的标记粘贴操作拼接两个标记并字符串化?
解决标记拼接后转字符串的宏问题
你遇到的问题核心是:直接拼接标记得到的是标识符,不是字符串;而直接把字符串化和标记粘贴混用会生成非法的预处理标记。
错误原因分析
- 第一段代码里,
concat(firstname, lastname)最终展开成stackoverflow,这是一个未定义的标识符,而printf的%s需要字符串字面量,所以编译器报“未声明”错误。 - 第二段代码尝试
#s1##s2,#s1会把s1转换成字符串字面量"stack",再和s2(overflow)粘贴,得到的是"stack"overflow,这不是合法的预处理标记,因此报错。
正确实现
要实现“先拼接标记,再字符串化”,需要利用宏的分层展开特性——先完成标记粘贴,再对结果进行字符串化:
#include <stdio.h> // 内层宏:完成标记粘贴 #define concat_(s1, s2) s1##s2 // 字符串化宏:将传入的标记转为字符串 #define str(s) #s // 外层宏:先拼接,再字符串化 #define concat_str(s1, s2) str(concat_(s1, s2)) #define firstname stack #define lastname overflow int main() { printf("%s\n", concat_str(firstname, lastname)); return 0; }
展开过程说明
concat_str(firstname, lastname)先展开为str(concat_(stack, overflow))- 接着
concat_(stack, overflow)展开为stackoverflow - 最后
str(stackoverflow)展开为"stackoverflow",这正是printf需要的字符串字面量。
内容的提问来源于stack exchange,提问作者thirdeye
相关产品推荐
相关产品推荐

