我应该如何从C++正确初始化C结构?

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++错误消息表明没有.

我有什么选择?

Che*_*Alf 8

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.,

  • 我不同意_The g++ -Wextra 警告级别不是很有用_这句话。 (2认同)