C _Generic 默认返回参数

标签 c generics gcc

我需要在 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/

相关文章:

GCC ARM 汇编预处理器宏

c - 如果我用 `-pedantic` 指定 ANSI C 的标准,我还需要 `-std=c89` 吗?

c++ - 没有输入/输出的函数是过程吗?

swift - 在 swift 中对 CollectionType 进行索引和迭代

java - 如何编写扩展数组容量的通用方法?

linux - 将 bash 脚本嵌入到 makefile 中

linux - 从 Ubuntu 终端使用不同的命令行参数循环

c - 我如何使用指针来使用 malloc 存储多个字符串

c++ - 如何在 Visual C++ 2010 的源文件中添加注释 "by default"

带有泛型的 Java Copy 构造函数