从函数返回struct变量而不创建中间变量的简写

时间:2013-11-07 17:57:38

标签: c function struct return typedef

我已经开始学习C89,并且正在深入研究结构。我的问题最好通过一个例子来解释。

想象一下这段代码:

typedef struct {
  int x, y, r;
} Circle;

Circle createCircle(int x, int y, int r){
  Circle create = {x, y, r};
  return create;
}

int main(void){
  Circle coords = createCircle(3, 2, 1);
  return 0;
}

如您所见,我在函数createCircle中创建变量create,然后将其返回到main函数。我想知道是否存在某种形式的速记来省略这个中间步骤,例如:

Circle createCircle(int x, int y, int r){
  return Circle {x, y, r};
}

当然,上述方法不起作用,但它应该让你知道我想要实现的目标。这是可能的,还是我最好先创建一个变量?

谢谢!

1 个答案:

答案 0 :(得分:9)

您正在寻找的构造称为复合文字,其语法实际上与您的演示完全相同。只需在类型周围添加parens:

return (Circle){x, y, r};

这是一个C99功能,用于为结构和数组等聚合创建文字(尽管它也可用于创建标量,有点反直觉),类似于整数和其他标量文字。除了前面的括号类型名称之外,语法与初始化类型的实例时一样。

与数据段中通常存在的其他文字不同,复合文字是在它们创建的范围内构建并驻留在自动存储中(如果它们在全局范围内,则为静态。)换句话说,使用临时命名的Circle是在机器代码级别实际上是相同的。