C语言中如何使用宏定义,构造包含变量值的字符串

文章讲述了如何在C/C++编程中使用宏定义,使字符串MY_ALG的值依赖于数值变量PARAM_N。通过两级宏展开技术,确保当PARAM_N值变化时,MY_ALG的值也随之更新,避免了直接使用宏名导致的问题。

场景描述如下,先有数值变量(或数值宏) PARAM_N,我想要以宏定义命名一个字符串,如

#define PARAM_N  100

#define MY_ALG  "Hello-100"

即,我希望命名的 "MY_ALG" 宏的尾部等于 PARAM_N 的值,

那么每当我修改 PARAM_N 的值的时候,需要同时修改 MY_ALG 的值,

有没有办法使用宏定义让 MY_ALG 的值直接依赖于 PARAM_N 呢?

以下是失败案例:

#define PARAM_N  100

#define STR(a)  #a
#define MY_ALG  "Hello-"STR(PARAM_N)

上述代码经过 printf("%s", MY_ALG) 测试输出的结果是,

MY_ALG = "Hello-PARAM_N"

即,宏名称 PARAM_N,而非其值 100,被转换成了字符串。


以下是正确方式:

#define PARAM_N  100
// 辅助宏,将参数展开为字符串
#define str_internal(a)  #a
// 主要宏,将参数先进行宏展开,然后再转换为字符串
#define STR(a)  str_internal(a)

#define MY_ALG  "Hello-"STR(PARAM_N)

其中,就算 PARAM_N 不是宏定义,而是 int val=50; 也可以用宏定义 STR(val) 预处理得到字符串 "50" 而非 "val".

这种宏定义技巧,叫做“两级展开”(有趣)

参考资料:chatGPT...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值