如何在不提及结构体类型名的情况下返回结构体字面量?
解决方案:GCC下无需显式指定结构体类型返回字面量
要实现预处理器宏中返回结构体字面量且不提及结构体类型,GCC提供了两种内置特性可以满足需求:
方法1:利用__typeof__获取函数返回类型
通过__typeof__(__func__())可直接获取当前函数的返回类型,无需显式写出结构体名称。对应的宏实现如下:
#define RETURN_STRUCT(...) return (__typeof__(__func__())) { __VA_ARGS__ };
使用示例
struct foo { int bar; }; struct foo f() { RETURN_STRUCT(.bar = 42); }
原理:__func__是C99标准定义的当前函数名宏,__func__()作为表达式传入__typeof__后,GCC会推断出该函数的返回类型(即struct foo),从而完成匿名结构体字面量的类型转换。
方法2:使用GCC内置函数__builtin_return_type
GCC提供了__builtin_return_type(func, n)内置函数,直接返回函数func的第n个返回类型(普通函数传0即可)。宏实现更直观:
#define RETURN_STRUCT(...) return (__builtin_return_type(__func__, 0)) { __VA_ARGS__ };
使用示例
struct bar { float val; const char* name; }; struct bar get_bar() { RETURN_STRUCT(.val = 3.14, .name = "pi"); }
为什么之前的尝试失败?
typeof(#__func__())错误:#是预处理器字符串化操作,会把__func__变成字符串(比如"f"),typeof("f")得到的是char*类型,无法匹配结构体类型。(__auto_type) { .bar = 42 }错误:__auto_type仅用于变量声明时的类型推断(如__auto_type var = { ... };),不能直接作为强制转换的类型使用,C语言的类型推断不支持跨表达式的这种用法。
内容的提问来源于stack exchange,提问作者Victor Sergienko
相关产品推荐
相关产品推荐

