是否有一种通过使用运算符##和变量值来“生成”函数名称的方法。例如:
#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 :(得分: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
本身就是一个宏,因此它也可以工作。 (最好用大写字母命名宏名称)。