4

如何向 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)
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 建议的那样。

于 2012-03-16T11:20:39.607 回答