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

前端之家收集整理的这篇文章主要介绍了我应该如何从C正确初始化C结构?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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错误消息表明没有.

我有什么选择?

@H_502_12@

解决方法

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

干杯&心连心,

@H_502_12@ @H_502_12@

猜你在找的C&C++相关文章