【问题标题】:How to get value macro in C?如何在C中获得价值宏?
【发布时间】:2021-11-03 06:15:31
【问题描述】:

我在使用 C 中的宏时遇到问题。有什么方法可以调用并获取宏中的参数值来调用函数?

下面的示例代码会产生错误:

#define order(i) fruits_i##_banana()

void fruits_1_banana()
{
    printf("Order banana\n");
}

int main()
{
   int a = 1;
   order(a);
}

【问题讨论】:

  • 有一个文字替换并且预处理器不会将a 转换为1,您可以使用指向函数的指针数组。
  • 有答案时不要更改问题。
  • 非常感谢,您能不能更清楚地告诉您如何使用指针数组在宏中起作用???
  • 对不起,因为上一个问题太混乱了,所以我更新一点信息,可以更了解我的情况
  • 这里有一个例子:stackoverflow.com/a/37394374/1606345 当然不需要逆向,只要使用原型和数组定义就可以了。

标签: c macros


【解决方案1】:

你需要在i之前和之后使用##

#define order( i ) fruits_##i##_banana()

void fruits_1_banana()
{
    printf("Order banana\n");
}

int main()
{
   order(1);
}

请注意,您不能将a 传递给order,因为宏扩展不获取变量的值,它只使用变量名。

参考:https://docs.microsoft.com/en-us/cpp/preprocessor/token-pasting-operator-hash-hash?view=msvc-160

相反,您可以使用函数指针数组:

#include <stdio.h>

static void fruits_0_banana(void)
{
    printf("Order banana 0\n");
}

static void fruits_1_banana(void)
{
    printf("Order banana 1\n");
}

static void (*order[])(void) = {
    fruits_0_banana, // Or NULL if you don't need it
    fruits_1_banana,
    // ...
};

int main(void)
{
    int a = 1;

    order[a]();
    return 0;
}

【讨论】:

  • 非常感谢,我再次更新了我的代码,但仍然出现错误,因为宏不理解值 a 为 1 :(
  • @Son,您需要根据您的确切要求更新问题,为什么需要将变量传递给将调用相应函数的宏?我认为您可能需要遵循 DavidRanieri 关于使用函数指针的建议 (See this)
  • 你不能,预处理器在运行时不起作用,而是在编译时起作用,并且a的值在这个阶段是未知的,甚至知道该值(即使用enum)有一个字面替换。阅读指向函数的指针,你可以使用order()[1];实现你想要的
  • 由于@kiner_shah 似乎同意使用函数指针,您有一个编辑,如果有用,请接受答案;)
  • @DavidRanieri,非常感谢代码编辑:-D
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2014-03-01
  • 2017-10-19
相关资源
最近更新 更多