在C11中使用_Generic宏失败

时间:2017-11-11 04:10:13

标签: c macros override c11

我尝试使用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()返回始终为1,当使用特定的三个函数isPrim_intisPrim_lintisPrim_llint时,它会按预期工作。我使用宏时有什么线索错了吗?

非常感谢!

1 个答案:

答案 0 :(得分:3)

你“忘记”发布了调用代码,但是我的水晶球告诉我你很可能“选择”一个函数,但实际上并没有实际调用它。您当前的_Generic只是求值为一个函数指针,稍后在布尔上下文中将其解释为“true”。

()运算符应用于_Generic表达式的结果,以实际调用该函数。 E.g。

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

可能不是您打算如何使用它。