c11 _Generic添加类型

时间:2012-03-16 09:48:29

标签: c generics overloading c11

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

2 个答案:

答案 0 :(得分:7)

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

您始终可以做的是给它另一个名称并使用默认情况来获取所提供的行为:

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

答案 1 :(得分:3)

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

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