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
相关产品推荐
相关产品推荐

