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)
答
如果这是你的代码,你就必须#undef
并重新#define
,是的。无法扩展类型通用表达式(AFAIK)。
如果它不是你的代码,我会引入第二个表达式,像Jens建议的扩展名。
注意:如果原始宏未定义“默认”选择,则包装将不起作用。请参阅comp.lang.c上的线程[Nested _Generic selections](https://groups.google.com/d/topic/comp.lang.c/1RQvT2a5DF0/discussion)。 – 2012-04-17 21:23:18
@ J.C.Salomon,我认为缺乏'default'不是问题,但我认为''X类型泛型表达式的所有分支的可兼容性是我想的。看我的编辑。 – 2012-04-18 07:45:34