静态结构体变量除指定字段外是否保证零初始化?
问题
在函数内部定义了一个静态结构体变量,仅对其中一个字段进行初始化:
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++中,当你使用指定初始化器初始化结构体时,未被显式指定的成员会被值初始化——对于基本类型(比如整数、指针这类)来说,值初始化就等同于零初始化。
而这里你用了constexpr修饰静态结构体,constexpr要求变量必须是常量表达式,这意味着整个结构体必须被完全初始化。编译器会自动将未指定的成员初始化为对应类型的零值(比如0、nullptr等),最终效果和先零初始化所有成员、再给你显式指定的event_mask字段赋值完全一致。
你可以放心,剩下的15个成员都会被设置为各自类型的默认零值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者smac89
相关产品推荐
相关产品推荐

