【发布时间】:2015-08-06 08:13:56
【问题描述】:
我发现这条线here:
uint32 bIsHungry : 1;
...而且我从未见过这种用于初始化变量的语法。
我已经习惯了:
uint32 bIsHungry = 1;
它看起来有点像初始化列表,但只是针对单个字段?
它是什么,它有什么作用,我为什么要关心?
【问题讨论】:
-
要初始化一个标量变量,您可以使用等号或圆括号或大括号。
标签: c++
我发现这条线here:
uint32 bIsHungry : 1;
...而且我从未见过这种用于初始化变量的语法。
我已经习惯了:
uint32 bIsHungry = 1;
它看起来有点像初始化列表,但只是针对单个字段?
它是什么,它有什么作用,我为什么要关心?
【问题讨论】:
标签: c++
该行是bit field declaration,它声明了一个具有显式位级大小的数据成员
来自 cppreference 的示例:
#include <iostream>
struct S {
// three-bit unsigned field,
// allowed values are 0...7
unsigned int b : 3;
};
int main()
{
S s = {7};
++s.b; // unsigned overflow
std::cout << s.b << '\n'; // output: 0
}
请注意,在上面的示例中,无符号溢出是 defined behavior(如果 b 被声明为有符号类型,则同样不适用)
您链接的文档还指出
布尔类型可以用 C++ bool 关键字或位域来表示
关于我为什么要关心我推荐阅读this other question
【讨论】:
这不是初始化,它是声明的片段。
struct {
// ...
uint32 bIsHungry : 1;
// ...
};
将bIsHungry 声明为struct 的位域成员。它说bIsHungry 是一个unsigned int,其长度为1 位。它的可能值为0 和1。
阅读有关位域的更多信息:http://en.cppreference.com/w/c/language/bit_field
【讨论】:
这是位域声明,声明一个具有显式大小的类数据成员,以位为单位。
【讨论】: