【问题标题】:Colon : used in variable initialization? [duplicate]冒号:用于变量初始化? [复制]
【发布时间】:2015-08-06 08:13:56
【问题描述】:

我发现这条线here:

uint32 bIsHungry : 1;

...而且我从未见过这种用于初始化变量的语法。

我已经习惯了:

uint32 bIsHungry = 1;

它看起来有点像初始化列表,但只是针对单个字段?

它是什么,它有什么作用,我为什么要关心?

【问题讨论】:

  • 要初始化一个标量变量,您可以使用等号或圆括号或大括号。

标签: c++


【解决方案1】:

该行是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

【讨论】:

  • 有趣!谢谢,我以前从未见过。
  • 在特殊情况下它可能会派上用场,例如硬件将映射到内存区域的位级部分。
【解决方案2】:

这不是初始化,它是声明的片段。

struct {
    // ...
    uint32 bIsHungry : 1;
    // ...
};

bIsHungry 声明为struct 的位域成员。它说bIsHungry 是一个unsigned int,其长度为1 位。它的可能值为01

阅读有关位域的更多信息:http://en.cppreference.com/w/c/language/bit_field

【讨论】:

    【解决方案3】:

    这是位域声明,声明一个具有显式大小的类数据成员,以位为单位。

    【讨论】:

    • 没有初始化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多