C _通用默认返回参数

时间:2019-07-22 08:44:58

标签: c generics gcc

我需要在C语言中使用_Generic,以便能够根据变量类型返回专用值。

double[] answers = new double[] { userID }.Concat(moneys).ToArray();

,以便对各种类型进行特殊处理,以返回一些字符串,但对于其余类型(默认),将返回参数本身。 “ return_param”的可能实现方式是什么?还是我必须为每种可能的类型实现专门的功能?

1 个答案:

答案 0 :(得分:3)

您可以在通用选择分支内调用函数,然后默认分支可以简单地求值为参数的值。唯一的麻烦是所有分支必须在语义上有效。因此,我们可以在此处为标量类型做个技巧:进行另一个通用选择。如果类型正确,则按原样返回参数,否则返回0强制转换为该类型,算术类型产生0,指针类型产生空指针。该分支不会被评估,因此很安全。因此我们得到

#define coerce_scalar(type, arg) _Generic((arg), type: (arg), default: (type)0)

#define encode(x) _Generic((x), \
    char *: encode_char_ptr(coerce_scalar(char *, (x))), \
    const char *: encode_const_char_ptr(coerce_scalar(const char *, (x))), \
    bool: encode_bool(coerce_scalar(bool, (x))), \
    default: (x))

通过对用{0}初始化的另一个分支使用复合文字,这也可以扩展为结构,并集类型-尽管大多数情况下,我猜测这将是结构的指针,即标量。

但是真正的解决方案是根本不为其他类型调用encode