如何在C中返回匿名结构?

Askaga

尝试一些代码,我意识到下面的代码可以编译:

struct { int x, y; } foo(void) {
}

似乎我们正在定义一个名为named的函数foo该函数返回匿名函数struct

现在,我的问题是:它是否只发生在使用我的编译器进行编译还是合法的C(99)?如果是这样,那么return语句的正确语法是什么?如何将返回值正确分配给变量?

2501

您要返回的结构不是匿名结构。C标准将匿名结构定义为不使用标签的另一个结构的成员。您返回的是一个没有标签的结构,但是由于它不是成员,因此它不是匿名的。Gcc使用名称<匿名>表示没有标签的结构。

假设您尝试在函数中声明相同的结构。

struct { int x, y; } foo( void )  
{
    return ( struct { int x, y; } ){ 0 } ;
}

gcc抱怨:返回类型“ struct <匿名>”时不兼容的类型,但是应该是“结构<匿名>”

显然类型不兼容。在标准中,我们看到:

6.2.7兼容类型和复合类型

1:如果两个类型相同,则它们具有兼容类型。用于确定两种类型是否兼容的其他规则在6.7.2中针对类型说明符进行了描述,在6.7.3中针对类型限定符进行了说明,在6.7.6中针对声明符进行了描述。此外,如果两个结构,联合或枚举类型的标签和成员满足以下要求,则它们是兼容的:如果它们的标签和成员满足以下要求:如果一个用标签声明,则另一个用相同标签声明。如果两者均在各自翻译单位内的任何位置完成,则以下附加要求适用:成员之间应存在一对一的对应关系,以使每对对应的成员声明具有兼容的类型;如果该对中的一个成员是使用对齐方式说明符声明的,则另一个使用等效的对齐方式说明符声明;如果该对中的一个成员用名称声明,则另一个用相同名称声明。对于两个结构,相应的成员应以相同的顺序声明。对于两个结构或联合,相应的位域应具有相同的宽度。对于两个枚举,相应的成员应具有相同的值。

第二个粗体部分说明,如果两个struct都没有标记,例如在此示例中,则它们必须遵循在该部分之后列出的其他要求,而这样做。但是,如果您注意到第一个粗体部分必须位于单独的翻译单元中,那么示例中的结构就不必了。因此它们不兼容,并且代码无效。

不可能使代码正确,因为如果您声明一个struct并在此函数中使用它,则必须使用一个标记,这违反了两个都必须具有相同标记的规则:

struct t { int x, y; } ;

struct { int x, y; } foo( void )   
{
    struct t var = { 0 } ;
    
return var ;
}

gcc再次抱怨:返回类型'struct t'时不兼容的类型,但应该是'struct <匿名>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章