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