2012-03-16 14 views
3

c11 _Generic関数に余分な型を追加するにはどうすればよいですか?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を評価することは決して簡単ではありません。そして、あなたははい、それはあなたのコードだ場合、あなたはそれを#undef#defineにそれを再する必要があります

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

注意:元のマクロで 'default'選択が定義されていない場合、折り返しは機能しません。 comp.lang.cのスレッド[入れ子_Genericの選択](https://groups.google.com/d/topic/comp.lang.c/1RQvT2a5DF0/discussion)をご覧ください。 –

+0

@ J.C.Salomon、 'default'の欠如は問題ではないと私は思うが、ジェネリック式のすべての枝を持つ' X'のcompabilityは、だと思います。私の編集を参照してください。 –

3

を行うことができます。タイプジェネリック式(AFAIK)を拡張する方法はありません。

あなたのコードではない場合は、Jensが提案したような拡張子を持つ2番目の式を導入します。

関連する問題