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