预处理器##运算符和变量
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
本身就是一个宏,因此它也可以工作。 (用大写字母命名宏名总是一个好主意)。
有没有办法通过使用运算符## 和变量值来"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
本身就是一个宏,因此它也可以工作。 (用大写字母命名宏名总是一个好主意)。