gpt4 book ai didi

在 C 中使用 typeof 创建一个特定的宏

转载 作者:太空宇宙 更新时间:2023-11-04 08:41:20 25 4
gpt4 key购买 nike

为了简化问题,如果我有如下两个结构:

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/

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