在 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_intisPrim_lintisPrim_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))
   ...

这可能不是您打算使用它的方式。