2012-03-16 43 views
3

如何爲c11 _通用函數添加額外的類型?c11 _通用添加類型

您是否需要#undef/re-#定義它?(如果是的話,下面的工作)還是有更好的方法?

#define to_str(X) _Generic((X), \ 
    long double: ld_str, \ 
    double: d_str, \ 
    float: f_str, \ 
    )(X) 

#undef to_str 

#define to_str(X) _Generic((X), \ 
    long double: ld_str, \ 
    double: d_str, \ 
    float: f_str, \ 
    int: i_str, \ 
    )(X) 

回答

7

我不確定我完全理解你的問題。你的意思是你有一個類型的通用宏,它是由某個庫提供的,你想用它自己的新類型修改它?

你總是可以做的是給它的另一個名稱,並使用默認的情況下,獲得規定的行爲:

#define to_str2(X) _Generic((X), default: to_str(X), int: i_str(X)) 

編輯

這不完全是因爲你的工作會必須將功能參數評估放入_Generic。這尤其意味着X的類型必須與嵌套泛型表達式的所有分支兼容。

如果有問題的庫有一個只返回函數本身的宏而沒有(X),比如to_strGen,那麼永遠不會評估X會更容易。然後,你可以做

#define to_str2Gen(X) _Generic((X), default: to_strGen(X), int: i_str) 
#define to_str2(X) to_str2Gen(X)(X) 
+0

注意:如果原始宏未定義「默認」選擇,則包裝將不起作用。請參閱comp.lang.c上的線程[Nested _Generic selections](https://groups.google.com/d/topic/comp.lang.c/1RQvT2a5DF0/discussion)。 – 2012-04-17 21:23:18

+0

@ J.C.Salomon,我認爲缺乏'default'不是問題,但我認爲''X類型泛型表達式的所有分支的可兼容性是我想的。看我的編輯。 – 2012-04-18 07:45:34

3

如果這是你的代碼,你就必須#undef並重新#define,是的。無法擴展類型通用表達式(AFAIK)。

如果它不是你的代碼,我會引入第二個表達式,像Jens建議的擴展名。