如何使用另一个宏创建C宏名称?

如何使用另一个宏创建C宏名称?,c,macros,c-preprocessor,C,Macros,C Preprocessor,我得到了一个定义以下宏的库: #define FOO_0(A, B) (A + B) #define FOO_1(A, B) (A - B) 现在我想创建一个新的宏MY_FOO,它接受第三个参数x,并使用它构建要调用的宏的名称(例如FOO) 这是我的实验: #define MY_FOO(X, A, B) FOO_## X ##(A, B) 但是,当我尝试在代码中使用它时: int main(void) { int a = 2, b = 3, x = 0; printf("FO

我得到了一个定义以下宏的库:

#define FOO_0(A, B) (A + B)
#define FOO_1(A, B) (A - B)
现在我想创建一个新的宏
MY_FOO
,它接受第三个参数
x
,并使用它构建要调用的宏的名称(例如
FOO

这是我的实验:

#define MY_FOO(X, A, B) FOO_## X ##(A, B)
但是,当我尝试在代码中使用它时:

int main(void) {
    int a = 2, b = 3, x = 0;
    printf("FOO_%d(%d, %d) = %d", x, a, b, MY_FOO(x, a, b));
    return 0;
}
我得到以下错误:

prog.c: In function ‘main’:
prog.c:6:25: error: pasting "FOO_x" and "(" does not give a valid preprocessing token
 #define MY_FOO(X, A, B) FOO_## X ##(A, B)
                         ^
prog.c:11:41: note: in expansion of macro ‘MY_FOO’
  printf("FOO_%d(%d, %d) = %d", x, a, b, MY_FOO(x, a, b));
                                         ^~~~~~
prog.c:6:25: warning: implicit declaration of function ‘FOO_x’ [-Wimplicit-function-declaration]
 #define MY_FOO(X, A, B) FOO_## X ##(A, B)
                         ^
prog.c:11:41: note: in expansion of macro ‘MY_FOO’
  printf("FOO_%d(%d, %d) = %d", x, a, b, MY_FOO(x, a, b));
                                         ^~~~~~

有办法解决这个问题吗?

如果确实需要将运行时值转换为宏名称,则必须自己完成:

switch(x) {
    case 0: printf("FOO_0(%d, %d) = %d", a, b, FOO_0(a, b));
            break;
}
您甚至可以使用本地语法定义使其稍微高级一些:

switch(x) {
#define CASE(x) case x: printf("FOO_" #x "(%d, %d) = %d", a, b, FOO_ ## x(a, b)); \
                        break
    CASE(0);
#undef CASE
}

如果确实需要将运行时值转换为宏名称,则必须自己完成:

switch(x) {
    case 0: printf("FOO_0(%d, %d) = %d", a, b, FOO_0(a, b));
            break;
}
您甚至可以使用本地语法定义使其稍微高级一些:

switch(x) {
#define CASE(x) case x: printf("FOO_" #x "(%d, %d) = %d", a, b, FOO_ ## x(a, b)); \
                        break
    CASE(0);
#undef CASE
}

第二个
##
不是必需的。在C中,永远不需要创建具有完全变量名的宏。宏名称是程序员的,而不是程序的。如果你仍然有这样的需求,你应该运行一个生成C代码的外部脚本。自动生成@bipll在下面的帖子中提出的代码实际上是一个非常好的主意,因为我必须对很多宏使用相同的模式,而第二个
不是必需的。在C中,永远不需要创建具有完全变量名的宏。宏名称是程序员的,而不是程序的。如果你仍然有这样的需求,你应该运行一个生成C代码的外部脚本。自动生成@bipll在下面的帖子中提出的代码实际上是一个非常好的主意,因为我必须对很多宏使用相同的模式谢谢你的答案!运行时值和编译时值之间的区别可能是这个问题的关键。更重要的是,宏在编译之前是解析时值。:)谢谢你的回答!运行时值和编译时值之间的区别可能是这个问题的关键。更重要的是,宏在编译之前是解析时值。:)