在 C11 中使用 _Generic 宏失败
Using the _Generic macro in C11 fails
我试着用 C11 _Generic
宏重载函数,如下所示:
int isPrim_int (int num);
int isPrim_lint (long int num);
int isPrim_llint (long long int num);
#define isPrim(_1, ...) _Generic((_1), \
int: isPrim_int, \
long int: isPrim_lint, \
long long int: isPrim_llint)
但由于某些原因,使用 isPrim()
returns 总是 1,当使用特定的三个函数 isPrim_int
、isPrim_lint
和 isPrim_llint
时,它按预期工作.任何线索我使用宏有什么问题?
非常感谢!
你 "forgot" 到 post 调用代码,但我的 crystal 球告诉我你很可能是 "selecting" 一个函数,但从未真正调用它.您当前的 _Generic
只是评估为一个函数指针,稍后在布尔上下文中将其解释为 "true"。
将 ()
运算符应用于 _Generic
表达式的结果,以实际 调用 函数。例如
#define isPrim(_1, ...) _Generic((_1), \
int: isPrim_int, \
long int: isPrim_lint, \
long long int: isPrim_llint)(_1)
您的原始版本也可以使用,但您必须按如下方式使用它
int a = 42;
if (isPrim(a)(a))
...
这可能不是您打算使用它的方式。
我试着用 C11 _Generic
宏重载函数,如下所示:
int isPrim_int (int num);
int isPrim_lint (long int num);
int isPrim_llint (long long int num);
#define isPrim(_1, ...) _Generic((_1), \
int: isPrim_int, \
long int: isPrim_lint, \
long long int: isPrim_llint)
但由于某些原因,使用 isPrim()
returns 总是 1,当使用特定的三个函数 isPrim_int
、isPrim_lint
和 isPrim_llint
时,它按预期工作.任何线索我使用宏有什么问题?
非常感谢!
你 "forgot" 到 post 调用代码,但我的 crystal 球告诉我你很可能是 "selecting" 一个函数,但从未真正调用它.您当前的 _Generic
只是评估为一个函数指针,稍后在布尔上下文中将其解释为 "true"。
将 ()
运算符应用于 _Generic
表达式的结果,以实际 调用 函数。例如
#define isPrim(_1, ...) _Generic((_1), \
int: isPrim_int, \
long int: isPrim_lint, \
long long int: isPrim_llint)(_1)
您的原始版本也可以使用,但您必须按如下方式使用它
int a = 42;
if (isPrim(a)(a))
...
这可能不是您打算使用它的方式。