C(或C ++?)语法:STRUCTTYPE varname = {0};

时间:2011-02-03 23:23:15

标签: c++ c syntax

通常,人们会在堆栈上声明/分配一个结构:

STRUCTTYPE varname;

这个语法在C中是什么意思(或者只是这个C ++,或者可能是VC ++特有的)?

STRUCTTYPE varname = {0};

其中STRUCTTYPE是stuct类型的名称,如RECT或其他东西。这段代码编译,似乎只是将结构的所有字节清零,但我想知道是否有人有引用。此外,这个结构有名称吗?

2 个答案:

答案 0 :(得分:8)

这是聚合初始化,是有效的C和有效的C ++。

C ++还允许您省略所有初始值设定项(例如零),但对于这两种语言,没有初始值设定项的对象都是值初始化或零初始化的:

// C++ code:
struct A {
  int n;
  std::string s;
  double f;
};

A a = {};  // This is the same as = {0, std::string(), 0.0}; with the
// caveat that the default constructor is used instead of a temporary
// then copy construction.

// C does not have constructors, of course, and zero-initializes for
// any unspecified initializer.  (Zero-initialization and value-
// initialization are identical in C++ for types with trivial ctors.)

答案 1 :(得分:3)

在C中,初始化程序{0}对于将任何类型的任何变量初始化为全零值有效。在C99中,这还允许您使用复合文字语法“零”分配给任何类型的任何可修改的左值:

type foo;
/* ... */
foo = (type){0};

不幸的是,如果类型是基本类型(例如int x = {0};)或嵌套结构/数组类型(例如{{1}),某些编译器会在初始化程序周围发出大括号“错误号码”的警告})。我会认为这些警告有害并将其关闭。