3

我们在哪里可以编写类似的代码

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

}

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

那这个呢

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

3 回答 3

5

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

于 2012-09-02T07:43:20.383 回答
1

从 C89 开始,返回 a 是可能且有用的struct

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

请注意,在 Linux x86-64 上,ABI定义了直接通过寄存器返回两个成员结构的调用约定。其他结构通过内存返回,因此返回可能比单个指针慢一点。

例如,您可以将一个点定义为调用struct的两个数字(例如intdouble)的 a x,并从某个例程y返回这样的 a 。在 Linux/x86-64 上,这两个数字将在两个寄存器中返回(当启用并可能优化时,无需在内存中构建一些数字),例如:structgetPositionstruct

 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在函数原型之前声明返回值。

于 2012-09-02T07:23:02.103 回答
0

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

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

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

不过,第 3.6.6.4 节“返回语句”并没有忘记将结构和联合作为返回类型。

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

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

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

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

于 2020-12-01T19:15:33.947 回答