gpt4 book ai didi

C _Generic 默认返回参数

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:07 24 4
gpt4 key购买 nike

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

const char *encode_char_ptr(char *x)
{
return (x ? x : "NULL");
}
....
#define encode(x) _Generic((x), \
char *: encode_char_ptr, \
const char *: encode_const_char_ptr, \
bool: encode_bool, \
default: return_param)(x)

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

最佳答案

您可以调用通用选择分支中的函数,然后默认分支可以简单地求出参数的值。唯一的麻烦是所有 分支必须在语义上有效。所以我们可以在这里为标量类型做一个技巧:进行另一个泛型选择。如果它是正确的类型,则按原样返回参数,否则返回转换为该类型的 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} 初始化的其他分支使用复合文字来扩展到结构、 union 类型 - 尽管我猜大部分情况下它会是指向结构的指针,即再次标量.

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

关于C _Generic 默认返回参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57142207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com