这个静态结构变量是否保证除了一个字段之外初始化为零?

问题描述 投票:0回答:1

在函数内部,我有一个静态变量,它是一个结构体,并且仅初始化了它的一个字段:

void func() {
  static constexpr xcb_change_window_attributes_value_list_t root_mask {
    .event_mask = XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
                  XCB_EVENT_MASK_PROPERTY_CHANGE |
                  XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY
  };
  
  // do something else
}

我想知道在设置结构体内部的一个字段之前是否保证结构体初始化为零,或者唯一发生的初始化仅发生在单个字段上?该结构还有大约 15 个其他成员,我明确不希望有任何其他值,但它们是默认值。

c++ c++17 static-variables list-initialization
1个回答
0
投票

我发现的一个更好的方法是使用

constexpr
lambda (C++17 起)函数来创建变量:

void func() {
  static constexpr auto root_mask = []() constexpr {
    xcb_change_window_attributes_value_list_t mask{}; // initialize here
    mask.event_mask =
        XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
        XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY;
    return mask;
  }();
  
  // do something else
}

这样,结构体完全初始化为零,并且编译器不会抱怨。

© www.soinside.com 2019 - 2024. All rights reserved.