You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不提及结构体类型名的情况下返回结构体字面量?

解决方案: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:15:37