2017-11-11 152 views
4

我试图重载函数与C11 _Generic宏是这样的:使用在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_lintisPrim_llint它按预期工作。任何线索什么是错误的我使用宏?

非常感谢!

+0

你怎么称呼它?呼叫代码怎么没有显示? – AnT

+0

我测试了三个函数本身的函数实现,所以我认为错误是与宏实现和实际功能不相关的问题;) –

回答

3

你“忘记”发布调用代码,但我的水晶球告诉我,最有可能你是“选择”一个功能,但从来没有真正调用它。您当前的_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)) 
    ... 

这可能不是你打算如何它被使用。

+0

感谢您帮助介绍这个很酷的新功能:) –