C中返回struct的函数

C中返回struct的函数,c,struct,C,Struct,我们在哪里可以编写这样的代码 struct Foo { int bar; int baz; } foo() { } C89/C90?C99?C11?或者只是K&R 那么这个呢 void foo(bar, baz) int bar; int baz; { } 从C89开始,返回结构是可能的,也是有用的 您的第二个示例foo是旧的K&R C,在较新的标准中被弃用 注意,在Linux x86-64上,定义直接通过寄存器返回两个成员结构。其他结构通过内存返回,因此返回速度可能比单个

我们在哪里可以编写这样的代码

struct Foo
{
    int bar;
    int baz;
} foo()
{

}
C89/C90?C99?C11?或者只是K&R

那么这个呢

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

从C89开始,返回
结构是可能的,也是有用的

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

注意,在Linux x86-64上,定义直接通过寄存器返回两个成员结构。其他结构通过内存返回,因此返回速度可能比单个指针稍慢

例如,您可以将一个点定义为一个名为
x
y
的由两个数字组成的
struct
(例如
int
double
)并从一些
getPosition
例程返回这样的
struct
。在Linux/x86-64上,这两个数字将在两个寄存器中返回(当启用并可能进行优化时,无需在内存中构建一些
struct
),例如:


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

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

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

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

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

但是,第3.6.6.4节“return语句”并没有遗漏结构和联合作为返回类型的一个字

第3.5.4.3节“功能声明器(包括原型)”说明:

函数声明器不应指定函数类型或数组类型的返回类型

它没有提到对结构或联合类型的任何限制,因为这将是这种限制的归属地,所以它们是允许的


C99有相同的措辞,它只是重新编号了部分。

不确定,第一个示例中您试图实现的是K&R和函数定义格式,它未经C标准批准。谢谢!我不能在任何C++标准中使用这个,是吗?@ NikitaTrophimov:当然,C++中也可以返回结构,但是不能在函数声明中定义它们。
 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;
 };