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

C语言中如何实现函数返回两种不同自定义结构体类型的结果

C语言实现类似TypeScript联合类型的返回值方案

C是静态强类型语言,没有原生支持带自动类型校验的联合类型,但可以通过**带标签的联合体(Tagged Union)**手动实现需求,具体实现如下:


实现步骤

  • 第一步:定义类型标签枚举,用来标记当前返回的结构体类型
  • 第二步:定义包含标签和联合体的返回结构体,联合体用来存储A或B的实例
  • 第三步:实现getAorB函数,根据入参k给返回结构体的标签和对应联合体成员赋值
  • 第四步:调用时先判断类型标签,再读取对应结构体成员

完整代码示例

#include <stdio.h>

// 自定义结构体A
typedef struct A {
    int val_a;
    // 其他A的成员...
} A;

// 自定义结构体B
typedef struct B {
    char* val_b;
    // 其他B的成员...
} B;

// 类型标签枚举,标记当前存储的是A还是B
typedef enum {
    AB_TYPE_A,
    AB_TYPE_B
} ABType;

// 函数返回值类型:带标签的联合体
typedef struct {
    ABType type;
    union {
        A a;
        B b;
    } data;
} ABResult;

// 业务函数实现
ABResult getAorB(int k) {
    ABResult res;
    if (k > 0) {
        res.type = AB_TYPE_A;
        res.data.a = (A){.val_a = 100}; // 按实际需求初始化A的成员
    } else {
        res.type = AB_TYPE_B;
        res.data.b = (B){.val_b = "test"}; // 按实际需求初始化B的成员
    }
    return res;
}

// 调用示例
int main() {
    ABResult res = getAorB(5);
    if (res.type == AB_TYPE_A) {
        printf("返回A类型,val_a = %d\n", res.data.a.val_a);
    } else if (res.type == AB_TYPE_B) {
        printf("返回B类型,val_b = %s\n", res.data.b.val_b);
    }
    return 0;
}

注意事项

C语言原生联合体不会自带类型标识,必须手动维护类型标签字段,未判断标签直接读取联合体成员会触发未定义行为。如果A、B结构体内存占用很大,也可以改成返回堆指针形式,避免栈上大内存拷贝。


内容的提问来源于stack exchange,提问作者user15307601

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:15:03