You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中通过宏的标记粘贴操作拼接两个标记并字符串化?

解决标记拼接后转字符串的宏问题

你遇到的问题核心是:直接拼接标记得到的是标识符,不是字符串;而直接把字符串化和标记粘贴混用会生成非法的预处理标记。

错误原因分析

  1. 第一段代码里,concat(firstname, lastname)最终展开成stackoverflow,这是一个未定义的标识符,而printf的%s需要字符串字面量,所以编译器报“未声明”错误。
  2. 第二段代码尝试#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;
}

展开过程说明

  1. concat_str(firstname, lastname)先展开为str(concat_(stack, overflow))
  2. 接着concat_(stack, overflow)展开为stackoverflow
  3. 最后str(stackoverflow)展开为"stackoverflow",这正是printf需要的字符串字面量。

内容的提问来源于stack exchange,提问作者thirdeye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:32:08