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

C语言宏如何识别变量并自动追加至参数末尾实现静态JSON打包

C语言静态JSON打包宏实现方案

核心思路

利用C预处理器的字符串自动拼接和宏展开特性,让JSON_INT(变量)同时替换为对应格式符,并自动把变量追加到printf的参数列表中,无需手动传入变量。

实现代码

// 基础类型宏:绑定格式符与变量,实现格式与参数的自动关联
#define JSON_INT(var) "%d", var
#define JSON_FLOAT(var) "%.2f", var
#define JSON_STRING(var) "%s", var

// 主打包宏:直接展开为printf调用
#define JSON_PRINT(json_template) printf(json_template)

使用示例

#include <stdio.h>

int main() {
    int user_id = 1001;
    float user_score = 95.5;
    const char* user_name = "Alice";

    // 直接在JSON模板中使用宏,无需手动传递变量参数
    JSON_PRINT("{\"id\": " JSON_INT(user_id) 
              ", \"name\": " JSON_STRING(user_name) 
              ", \"score\": " JSON_FLOAT(user_score) "}");
    
    return 0;
}

展开原理

预处理器会自动完成两步关键操作:

  1. 相邻字符串字面量自动拼接:比如"{\"id\": " + "%d" + ", \"name\": "最终拼成完整的格式字符串"{\"id\": %d, \"name\": %s, \"score\": %.2f}"
  2. 宏展开后的变量自动追加:JSON_INT(user_id)展开后的, user_id会被追加到printf的参数列表末尾,最终生成的代码等价于:
printf("{\"id\": %d, \"name\": %s, \"score\": %.2f}", user_id, user_name, user_score);

扩展说明

  • 可快速新增其他JSON类型的宏,比如布尔类型:#define JSON_BOOL(var) "%s", (var)?"true":"false"
  • 如果需要输出到缓冲区而非标准输出,只需修改主宏为snprintf:
#define JSON_SPRINT(buf, size, json_template) snprintf(buf, size, json_template)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:52:37