预处理器##运算符和变量

Prepocessor ## Operator and variable

有没有办法通过使用运算符## 和变量值来"generate" 函数名。例如:

#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);

干杯

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

如前所述,宏展开是在编译时完成的,因此函数名在 运行 时是未知的。

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

示例:

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)

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

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

因此,在您的情况下,FUN(fun,i) 将被替换为文本和表单 funi。构建您想要的函数名称的唯一有限方法是使用实​​际文本值或其他宏。以下是 2 个可用于预处理的示例:

FUN(fun, 0)(1);

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

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