为何返回匿名结构体的函数构造无法通过GCC编译?
为什么匿名结构体作为函数返回值的构造会编译失败?
先看你给出的代码:
struct { int a, b; float c; } func () { struct { int a, b; float c; } test; return test; //return (struct { int a, b; float c; }){0,0,0.0}; /* same with designated initializer */ }
编译时会出现以下错误和警告:
error: incompatible types when returning type ‘struct ’ but ‘struct ’ was expected
warning: control reaches end of non-void function
核心原因
在C语言规则里,每一次匿名结构体的定义都会生成一个全新的、独立的类型——哪怕两个匿名结构体的成员数量、类型、顺序完全一致,编译器也不会认为它们是同一种类型。
你代码里的函数返回值是一个匿名结构体类型,而函数内部定义的test又是另一个匿名结构体类型,这两个类型在编译器眼里完全不兼容,所以返回test时会触发类型不匹配的错误。至于那个警告,是因为编译器在类型错误的前提下,判定函数可能没有正确返回值导致的,本质还是类型不兼容的问题。
解决方法
要解决这个问题,你需要让函数返回值类型和内部变量的类型统一,有两种常用方式:
方式1:给结构体添加标签(tag)
给结构体指定一个标签名,后续统一使用这个带标签的结构体类型:
struct Data { int a, b; float c; }; struct Data func() { struct Data test; return test; // return (struct Data){0, 0, 0.0}; // 用复合字面量初始化也能正常编译 }
方式2:使用typedef定义结构体类型
通过typedef给匿名结构体起一个别名,简化类型的使用:
typedef struct { int a, b; float c; } Data; Data func() { Data test; return test; // return (Data){0, 0, 0.0}; }
内容的提问来源于stack exchange,提问作者Edenia
相关产品推荐
相关产品推荐

