gpt4 book ai didi

c - _Generic 来填充一些 union

转载 作者:太空狗 更新时间:2023-10-29 17:03:32 24 4
gpt4 key购买 nike

我想使用 C11 _Generic 关键字根据静态类型填充 union ,如:

typedef union {
double d;
long l;
const char*s;
void*p;
} ty;

#define make_ty(X) _Generic((X), \
double: (ty){.d=(X)}, \
long: (ty){.l=(X)}, \
const char*: (ty){.s=(X)}, \
default: (ty){.p=(X)})

ty from_double(double x) { return make_ty(x); }
ty from_string(const char*s) { return make_ty(s); }
ty from_long(long l) { return make_ty(l);}

但这不会编译,例如GCC 5.3 给出(使用 gcc -std=c11 -Wall):

u.c: In function ‘from_double’:
u.c:11:35: error: incompatible types when initializing type ‘const char *’
using type ‘double’
const char*: (ty){.s=(X)}, \
^
u.c:14:41: note: in expansion of macro ‘make_ty’
ty from_double(double x) { return make_ty(x); }

顺便说一句,使用 gcc -std=c99 -Wall 给出同样的错误...

或者 _Generic 只对 tgmath.h 有用吗?

我认为 _Generic 根据编译器已知类型选择表达式,因此无意义的 (ty){.s=(x)} 将是在 from_double....

中被忽略

(如果确实有效,我将能够根据编译器已知的静态参数类型“重载”make_ty...)

最佳答案

_Generic 的所有分支都必须是有效代码,就像在 if (1) { here; 中一样。 } else { 那里; }。要获得解决方案,您可以采取相反的方式。定义类似于以下的函数:

inline ty from_double(double x) { return (ty){ .d = x }; }

对于您所有的情况,然后将宏设置为:

#define make_ty(X) _Generic((X),                     \
double: from_double, \
double: from_long, \
...)(X)

通过 inline 编译器的可见性实际上能够优化此类代码并且通常不会通过调用函数指针。

关于c - _Generic 来填充一些 union,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35570709/

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