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

C++ C(或C+;+;?)语法:STRUCTTYPE varname={0};,c++,c,syntax,C++,C,Syntax,通常情况下,在堆栈上声明/分配一个结构: STRUCTTYPE varname; 这个语法在C中意味着什么(或者仅仅是这个C++,或者是特定于VC++)?< /P> 其中STRUCTTYPE是一个stuct类型的名称,如RECT或其他。这段代码经过编译,看起来只是将结构的所有字节归零,但我想确定是否有人有引用。另外,这个结构有名字吗?< /p> 这是聚合初始化,既有效C又有效C++。< /P> C++还允许您省略所有初始值设定项(例如零),但对于这两种语言,没有初始值设定项的对象都是值初始化或

通常情况下,在堆栈上声明/分配一个结构:

STRUCTTYPE varname;
<>这个语法在C中意味着什么(或者仅仅是这个C++,或者是特定于VC++)?< /P>
其中STRUCTTYPE是一个stuct类型的名称,如RECT或其他。这段代码经过编译,看起来只是将结构的所有字节归零,但我想确定是否有人有引用。另外,这个结构有名字吗?< /p> 这是聚合初始化,既有效C又有效C++。< /P> 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.)

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

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

不幸的是,如果初始值设定项的类型是基本类型(例如
intx={0};
)或嵌套结构/数组类型(例如
struct{inti[2];}x={0};
),则某些编译器会警告您该初始值设定项周围的大括号数量“错误”。我会认为这样的警告是有害的,并将它们关闭。

这是一个聚合初始化器。C不会对
std::string
进行零初始化,因为C中不会有
std::string
。但除此之外,这是正确的。+1,我不知道可以将大括号留空。多方便啊!
type foo;
/* ... */
foo = (type){0};