【问题标题】:c11 _Generic adding typesc11 _Generic 添加类型
【发布时间】:2012-03-16 09:48:28
【问题描述】:

如何为 c11 _Generic Functions 添加额外的类型?

你必须#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)

【问题讨论】:

    标签: c generics overloading c11


    【解决方案1】:

    我不确定我是否完全理解您的问题。你的意思是你有一个由某个库提供的类型泛型宏,你想用你自己的新类型来修改它?

    你总是可以做的是给它另一个名字并使用默认大小写来获得提供的行为:

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

    【讨论】:

    • 警告:如果原始宏未定义default 选择,则换行将不起作用。请参阅 comp.lang.c 上的线程 Nested _Generic selections
    • @J.C.Salomon,我认为缺少default 不是问题,但我认为X 与泛型表达式类型的所有分支的兼容性是。查看我的编辑。
    【解决方案2】:

    如果它是您的代码,您必须#undef 它并重新#define 它,是的。无法扩展类型泛型表达式 (AFAIK)。

    如果不是您的代码,我会引入第二个表达式,如 Jens 建议的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多