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; }
展开原理
预处理器会自动完成两步关键操作:
- 相邻字符串字面量自动拼接:比如
"{\"id\": "+"%d"+", \"name\": "最终拼成完整的格式字符串"{\"id\": %d, \"name\": %s, \"score\": %.2f}" - 宏展开后的变量自动追加:
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
相关产品推荐
相关产品推荐

