我有一个需要连接字符串的代码,如下所示:
#define CMD(A,B) CMD_##A_PROMPT##B
void main()
{
int a = 10, b = 5;
printf("%s\n", CMD(a, b));
}
期望的输出是:CMD10_PROMPT5
这可以通过任何方式实现吗?
我有一个需要连接字符串的代码,如下所示:
#define CMD(A,B) CMD_##A_PROMPT##B
void main()
{
int a = 10, b = 5;
printf("%s\n", CMD(a, b));
}
期望的输出是:CMD10_PROMPT5
这可以通过任何方式实现吗?
我不认为这是可以做到的,因为您要查找的宏是编译时“字符串化”,参数在运行时接收它们的值。
如果您正在寻找运行时“字符串化”,请使用sprintf
等。
您可以通过替换来做到这一点int a = 10, b = 5;
:
#define a 10
#define b 5
否则是不可能的。C 翻译发生在标准中定义的一系列阶段,预处理阶段发生在任何对象定义被解析之前。就预处理器而言,int a = 10
不会在 tokena
和 token之间建立任何关系10
。
如果您所追求的只是输出,请这样做:
#define CMD_PATTERN "CMD_%d_PROMPT%d"
int main() {
int a = 10, b = 5;
printf(CMD_PATTERN "\n", a, b);
}
不幸的是,参数的提供顺序与它们在模式中出现的顺序相同——这使得将来很难更改顺序。出于这个原因,定义格式化函数可能比仅仅定义一个模式更好。