使用##和#运算符在C中连接宏中的字符串

时间:2012-06-07 08:23:29

标签: c macros operator-keyword

我有一个代码需要连接字符串,如下所示:

#define CMD(A,B)  CMD_##A_PROMPT##B

void main()
{
    int a = 10, b = 5;
    printf("%s\n", CMD(a, b));
}

所需的输出为:CMD10_PROMPT5
这可以通过任何方式实现吗?

2 个答案:

答案 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);
}

不幸的是要求参数的提供顺序与它们在模式中出现的顺序相同 - 这使得将来很难改变顺序。因此,定义格式化函数而不仅仅是模式可能更好。