通常,人们会在堆栈上声明/分配一个结构:
STRUCTTYPE varname;
这个语法在C中是什么意思(或者只是这个C ++,或者可能是VC ++特有的)?
STRUCTTYPE varname = {0};
其中STRUCTTYPE是stuct类型的名称,如RECT或其他东西。这段代码编译,似乎只是将结构的所有字节清零,但我想知道是否有人有引用。此外,这个结构有名称吗?
答案 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}),某些编译器会在初始化程序周围发出大括号“错误号码”的警告})。我会认为这些警告有害并将其关闭。