在没有赋值的情况下初始化struct?

时间:2014-04-25 13:36:49

标签: c variables struct initialization

我无法在互联网上找到答案,所以这是我的问题:我可以定义一个结构实例而不将其分配给C中的本地或全局变量吗? E.g:

struct A {
  int b;
}

struct A foo() {
  return struct A { .b = 42 };
}

如果不可能:为什么?

3 个答案:

答案 0 :(得分:2)

是的,您可以在C99及更高版本中使用复合文字。

return (struct A) { .b = 42 };

你甚至可以指向他们:

struct A *a = &(struct A) { .b = 42 };
a->b = 43;

这些文字比字符串文字“更好”,因为它们是可写的。当且仅当您在文字类型中包含const时,编译器才可以汇集它们。

答案 1 :(得分:1)

是C99为此提供复合文字( see it live ):

return (struct A) {  42 } ;

包含在draft C99 standard部分6.5.2.5 复合文字中,并说:

  

后缀表达式由带括号的类型名称后跟括号括起的初始值设定项列表组成,是一个复合文字。它提供了一个未命名的对象   值由初始化列表给出。 84)

  

复合文字的值是由初始化的未命名对象的值   初始化列表。如果复合文字出现在函数体外,则为对象   有静态存储时间;否则,它有自动存储持续时间   封闭的块。

并提供了几个例子,包括:

  

示例3具有名称的初始化程序可以与复合文字组合。结构对象   使用复合文字创建的文件可以传递给函数而不依赖于成员顺序:

drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4});

gcc在其扩展部分中也有nice document,因为它支持C99以外的此功能以及clang

答案 2 :(得分:0)

是的,从C99开始就有可能。这是复合文字。

但是,你的语法错了。使用:

(struct A){.b=42}

(struct A){42}

但是,如果无关紧要,请选择常量文字:

(const struct A){.b=42}

所有常量文字都受到常量池的影响(包括由于历史原因而具有类型char[]的字符串文字)。
任何函数外的常量复合文字和复合文字都有静态存储时间,
其余的都有自动存储持续时间(注意返回指针,每次都必须初始化)。

总之,尽可能选择常量文字。

相关问题