场景描述如下,先有数值变量(或数值宏) 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...