2011-02-03 34 views
4

通常人們會聲明/棧上分配結構:C(或C++?)語法:STRUCTTYPE varname = {0};

STRUCTTYPE varname; 

是什麼語法意味着C(或這是僅限於C++,或者具體到VC++)?

STRUCTTYPE varname = {0}; 

其中STRUCTTYPE是stuct類型的名稱,比如RECT或其他。這段代碼編譯,它似乎只是零結構的所有字節,但我想知道如果任何人有一個參考。另外,這個構造是否有名字?

+2

它是一個聚合初始值設定項。 http://stackoverflow.com/questions/2837854/initializing-an-object-to-all-zeroes/2838033#2838033 – AnT 2011-02-03 23:28:11

回答

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

C不會初始化一個`std :: string`,因爲你不會有` std :: string`在C中。但除了那個挑剔之外,這是正確的。 – 2011-02-03 23:40:29

3

在C中,初始化器{0}是有效初始化任意變量任意類型爲全零值。在C99,這也可以讓你使用複合文字語法分配「零」任何類型的任何修改的左值:

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

不幸的是一些編譯器會給你警告,周圍有括號的「打錯了」如果類型是基本類型(例如int x = {0};)或嵌套結構/數組類型(例如struct { int i[2]; } x = {0};),則爲初始值設定項。我會認爲這些警告是有害的,並將其關閉。