我在C文件中有以下代码:
#include <sys/socket.h> // ... void someFunc() { struct msghdr msg = {0}; // <<< Uninitialized member here }
当我使用-Wall -Wextra用g编译时,我收到警告:
error: missing initializer for member 'msghdr::msg_namelen' ...same for several other fields
我的问题是:我无法显式初始化所有字段,因为我不知道struct msghdr中将存在哪些字段(跨平台).该结构没有默认构造函数,因为它是一个C结构.我的印象是= {0}表单导致所有字段的零初始化(这对我来说没问题),但g错误消息表明没有.
我有什么选择?
解决方法
void someFunc() { msghdr msg = {}; // <<< All members zero-initialized }
g -Wextra警告级别是恕我直言,不是很有用.
您所拥有的代码对于“C结构”也是正式的,在标准的POD(普通旧数据)中.但是你的代码用0显式初始化第一个成员.这不一定适用于非POD的聚合,例如使用std :: string作为第一个成员,而pure {}也适用于此.
顺便说一句,通常像你正在处理的那个POD有一个字节数作为第一个成员,然后你可以这样做……
void foo() { SomePODStruct o = {sizeof(o)}; // The other members zero-initialized. }
也许添加字节计数成员为第一个的STATIC_ASSERT(偏移量为0).
干杯&心连心,