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

标签 c gcc

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

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/

相关文章:

c - 在其他结构中使用结构。 C

c - 如何正确返回结构数组(在此 codewars 示例中)?

c - clang <built-in> 头文件在哪里?

c++ - 对程序的编译时属性进行基准测试

c - 当您不知道有多少个整数时,如何从 char 字符串中读取整数? (在 C 中)

c - 思考TAILQ的tqe_prev不指向前一个节点的目的

c - 如何使用#defines 最好地打开/关闭单元测试

c++ - 安装Qt报错 "The procedure entry point _ZdaPvj could not be located in the dynamic link library C:\Qt\4.8.6\bin\qmake.exe"

gcc - 我可以确定用于创建仅二进制共享库的编译器/链接器标志吗?

gcc - 我应该用最新版本编译 GCC 吗?