我尝试使用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_int
,isPrim_lint
和isPrim_llint
时,它会按预期工作。我使用宏时有什么线索错了吗?
非常感谢!
答案 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))
...
可能不是您打算如何使用它。