【问题标题】:use of ## and # operator to concatenate the strings in a macro in C使用##和#运算符连接C中宏中的字符串
【发布时间】:2012-06-07 08:23:28
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么需要宏? printf("CMD%d_PROMPT%d\n",a,b); 有什么问题吗? ab 的值是运行时属性,因此不可用于宏扩展。
  • 这个宏会被用来调用很多宏,这些宏的形式是:CMD10_PROMPT5 CMD11_PROMPT6 CMD12_PROMT10 等等,每个都有进一步的定义......所以简单的printf将不起作用
  • 为什么是宏?随着变量值在运行时发生变化,您肯定需要函数而不是宏吗?
  • 我有一个大代码,为了使代码紧凑,我正在考虑使用这个功能,但我想我将无法使用它。感谢您的帮助

标签: c macros operator-keyword


【解决方案1】:

我不认为这是可以做到的,因为你正在寻找的宏是一个编译时“字符串化”,参数在运行时接收它们的值-时间

如果您正在寻找运行时“字符串化”,请使用sprintf 等。

【讨论】:

  • 有没有办法将宏与变量和文本结合起来?
  • 不在编译时。同样,如果您想要文本与存储在变量中的值的运行时组合,请使用sprintf
【解决方案2】:

您可以通过将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);
}

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

【讨论】:

    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 2014-02-27
    • 2010-12-16
    • 2011-07-12
    • 2012-05-07
    • 2017-08-27
    • 1970-01-01
    相关资源
    最近更新 更多