2015-07-05 52 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 
};