函数返回C中的结构

时间:2012-09-02 07:17:32

标签: c struct

我们在哪里可以编写像

这样的代码
struct Foo
{
    int bar;
    int baz;
} foo()
{

}

C89 / C90? C99? C11?或者也许它只是K& R?

那么这个

void foo(bar, baz)
int bar;
int baz;
{
}

3 个答案:

答案 0 :(得分:5)

这是自C89以来的标准。在K& R C中,不可能返回结构,只能指向结构。

答案 1 :(得分:1)

从C89开始,返回struct

是可能的,也是有用的

您的第二个示例foo是旧的K& R C,并且在较新的标准中已被弃用。

请注意,在Linux x86-64上,ABI定义了calling conventions,它通过寄存器直接返回一个二元结构。其他结构通过内存返回,因此返回的速度可能比单个指针慢一些。

例如,您可以将一个点定义为两个数字struct(例如intdouble),称为xy并返回来自某个struct例程的getPosition。在Linux / x86-64上,这两个数字将在两个寄存器中返回(无需在内存中构建一些struct,当启用并且可以实现优化时),例如:

 struct point_st { int x, y; };

 struct point_st getPosition(void);

 struct point_st getPosition () {
   struct point_st res = {-1,-1};
   res.x = input_x();
   res.y = input_y();
   return res;
 };

您通常希望在函数原型之前声明返回的struct

答案 2 :(得分:0)

在C89 / C90中,可能有一个返回结构的函数。

我没有在标准中找到任何明确的定义,但是在第3.3.2.3节“结构和联合成员”的脚注中说:

示例1:如果 f 是返回结构或联合的函数,而 x 是该结构或联合的成员,则 f()。x 是有效的后缀表达式,但不是左值。

第3.6.6.4节“ return语句”不会遗漏关于结构和联合作为返回类型的信息。

第3.5.4.3节“函数声明符(包括原型)”说:

函数声明符不得指定函数类型或数组类型的返回类型。

它没有提及对结构或联合类型的任何限制,并且由于这是此类限制所属的地方,因此允许使用它们。

C99的措词相同,只是重新编号了各个部分。