前辈##运算符和变量

时间:2019-03-11 13:58:26

标签: c macros c-preprocessor

是否有一种通过使用运算符##和变量值来“生成”函数名称的方法。例如:

#define FUN_I(fun, fun_id)  fun##fun_id
#define FUN(fun, fun_id)    RECV_CB_FUN_I(fun, fun_id)

int foo0(int x) {
    // do something
}
int main()
{
   int i = 0;
   FUN(foo,i)(1);
}

FUN生成fooi。有没有办法以某种方式获得foo0,或者在这种情况下我必须使用实际数字0,例如FUN(foo, 0)(1);

欢呼

3 个答案:

答案 0 :(得分:3)

您必须使用实际的0(或另一个宏)。宏扩展在编译时由C预处理器处理。它对变量的运行时值一无所知。

答案 1 :(得分:2)

如前所述,宏扩展是在编译时完成的,因此在运行时不会知道函数名称。

使用函数指针和指向它们的数组更合适。

示例:

typedef int (*TFoo)(int);

int foo1(int x)
{
    printf("from foo1: x = %d\n", x);
    return 0;
}

int foo2(int x)
{
    printf("from foo2: x = %d\n", x);
    return 0;
}

TFoo foos[2] = {foo1, foo2};
#define foo(i, x) foos[i](x)

就是这样。希望对您有帮助

答案 2 :(得分:1)

'c'预处理是用宏定义中的文本替换宏的过程。像##这样的某些操作允许将其参数作为文本添加到定义中。因此,一切都在编译开始之前就完成了。

结果,在您的情况下,FUN(fun,i)将被替换为文本和格式funi。生成所需函数名称的唯一受限方法是使用实​​际文本值或其他宏。以下是两个可以进行预处理的示例:

FUN(fun, 0)(1);

#define I 0
FUN(fun, I)(1);

在最后一种情况下,I本身就是一个宏,因此它也可以工作。 (最好用大写字母命名宏名称)。