为了简化问题,如果我有如下两个结构:
typedef struct test1_s {
uint16_t value1;
uint16_t b;
} test1_t;
typedef struct test2_s {
uint32_t value1;
uint32_t c;
} test2_t;
我想要一个像这样工作的宏:
value = GET(x, value1);
但是对于不同类型的x,会对x->value1做不同的处理。
我的想法是:
#define GET_test1_t_value1(x) x->value1 + 1
#define GET_test2_t_value1(x) x->value1 + 2
#define GET(x, field) GET_##typeof(x)##_##field(x)
但是看起来 typeof 不能像这样工作....
有什么办法可以实现吗?它需要用纯 C 语言完成。谢谢!
最佳答案
typeof
是非标准的(它是 gcc 提供的扩展,可能还有一些其他编译器)。而且它不会扩展为字符串,因此正如您已经发现的那样,您不能像您尝试做的那样在宏定义中使用。
C11 添加了一个新的 _Generic
关键字,它允许像您想要的那样的东西。它用于一种称为通用选择的新型表达式。
C 标准的例子:
#define cbrt(X) _Generic((X), \
long double: cbrtl, \
default: cbrt, \
float: cbrtf \
)(X)
(default
关联允许对整数类型使用 cbrt
,它将隐式转换为 double
。)
参见 N1570 的第 6.5.1.1 节2011 ISO C 标准草案。
当然只有当你的编译器支持时你才可以使用它。 gcc 在几天前发布的 4.9 版中首次添加了对 _Generic
的支持。
关于在 C 中使用 typeof 创建一个特定的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23418288/