c11 _通用添加类型

问题描述:

如何为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) 

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

你总是可以做的是给它的另一个名称,并使用默认的情况下,获得规定的行为:

#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

如果这是你的代码,你就必须#undef并重新#define,是的。无法扩展类型通用表达式(AFAIK)。

如果它不是你的代码,我会引入第二个表达式,像Jens建议的扩展名。