2015-07-05 55 views
-3

我最近遇到了一些很奇怪的語法:課堂成員聲明後冒號?

struct Test { 
    size_t a : 2; 
    size_t b : 3; 
    size_t c : 4; 
}; 

奇怪的是,這個編譯使用GCC 4.9.2與打開所有的警告標誌。

void test_test() { 
    Test test; 
    std::cout << test.a << " " << test.b << " " << test.c << std::endl; 
} 

雖然宣佈測試不提供任何錯誤和輸出0 0 0(我相信0僅僅是巧合,因爲結構是普通老式的數據,沒有它的成員是默認初始化爲0),改變 聲明的定義通過Test test();給出了錯誤

tester.cpp:14:20: error: request for member 'a' in 'test', which is of non-class 
type 'Test()' 

啓用C++ 11刪除錯誤信息,但數值仍然令人費解0 是什麼語法實現

+0

這是一個位域。 – ikegami

+1

'Test test();'聲明一個不帶參數的函數並返回'Test',而不是'Test'類型的變量。 – WorldSEnder

+1

(這被稱爲「最令人頭痛的解析」) – deviantfan

回答

3

該語法是bitfields。

struct Test { 
    size_t a : 2; // Occupies two bits 
    size_t b : 3; // Occupies three bits 
    size_t c : 4; // Occupies four bits 
};