4

c11 _Generic 関数に追加の型を追加するにはどうすればよいですか?

それを #undef/re-#define する必要がありますか?(そうであれば、次のように動作します)、またはもっと良い方法がありますか?

#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)
4

2 に答える 2

8

あなたの質問を完全に理解しているかどうかわかりません。あるライブラリによって提供されたタイプ ジェネリック マクロがあり、それを独自の新しいタイプで修正したいということですか?

いつでもできることは、別の名前を付けてデフォルトのケースを使用して、提供された動作を取得することです。

#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)
于 2012-03-16T11:10:17.923 に答える
3

それがあなたのコードであるなら、あなたは#undefそれをしなければならないでしょう#define、そうです。型ジェネリック式(AFAIK)を拡張する方法はありません。

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

于 2012-03-16T11:20:39.607 に答える