首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在_Generic中使用C11宏失败

在_Generic中使用C11宏失败
EN

Stack Overflow用户
提问于 2017-11-11 04:10:12
回答 1查看 279关注 0票数 4

我试图用C11 _Generic宏重载一个函数,如下所示:

代码语言:javascript
复制
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时,它按预期工作。有什么线索吗?我使用宏有什么问题?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-11 04:15:22

您“忘记”发布调用代码,但我的水晶球告诉我,您很可能是在“选择”一个函数,但从未真正调用它。当前的_Generic只是计算为一个函数指针,该指针后来在布尔上下文中被解释为"true“。

()运算符应用于_Generic表达式的结果,以实际调用函数。例如。

代码语言:javascript
复制
#define isPrim(_1, ...) _Generic((_1),                              \
                          int:              isPrim_int,             \
                          long int:         isPrim_lint,            \
                          long long int:    isPrim_llint)(_1)

您的原始版本也将工作,但您必须按以下方式使用它

代码语言:javascript
复制
int a = 42;
if (isPrim(a)(a))
   ...

这可能不是你想要用的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47234245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档