2017-11-11 183 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

感謝您幫助介紹這個很酷的新功能:) –