【问题标题】:Function returning struct in CC中的函数返回结构
【发布时间】:2012-09-02 07:17:31
【问题描述】:

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

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

}

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

这个呢

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

【问题讨论】:

  • 不确定,您在第一个示例中要实现的目标,但第二个是 K&R 和函数定义格式,它未被 C 标准批准。

标签: c struct


【解决方案1】:

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

【讨论】:

  • 谢谢!而且我不能在任何 C++ 标准中使用它,是吗?
  • @NikitaTrophimov:您当然也可以在 C++ 中返回结构,但您不能在函数声明中定义它们。
【解决方案2】:

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

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

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

例如,您可以将一个点定义为两个数字(例如 intdouble)的 struct,分别称为 xy,并从一些 getPosition 返回这样的 struct常规。在 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

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

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

    C99 的措辞相同,只是对部分进行了重新编号。

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2013-10-12
      相关资源
      最近更新 更多