简体   繁体   中英

How should I properly initialize a C struct from C++?

I have the following code in a C++ file:

#include <sys/socket.h>

// ...
void someFunc() {
    struct msghdr msg = {0};  // <<< Uninitialized member here
}

When I compile with g++ using -Wall -Wextra , I get warnings:

error: missing initializer for member 'msghdr::msg_namelen'
...same for several other fields

My problem is this: I can't explicitly initialize all the fields, because I don't know what fields will exist (cross-platform) in a struct msghdr . The struct doesn't have a default constructor, since it's a C struct. I was under the impression that the = {0} form led to zero-initialization of all fields (which would be fine for me), but the g++ error message suggests not.

What are my options here?

void someFunc()
{
    msghdr msg = {};  // <<< All members zero-initialized
}

The g++ -Wextra warning level is IMHO not very useful.

The code that you have is also formally OK for a "C struct", in standardeese known as POD (Plain Old Data). But your code explicitly initializes first member with 0. That won't necessarily work for an aggregate that isn't POD, eg with a std::string as first member, while the pure {} will work also for that.

In passing, often a POD like the one you're dealing with has a byte count as first member, and then you can do like …

void foo()
{
    SomePODStruct o = {sizeof(o)};    // The other members zero-initialized.
}

Perhaps add a STATIC_ASSERT that the byte count member is first (at offset 0).

Cheers & hth.,

这应该工作:

memset(&msg, 0, sizeof(msg));

The specific warning flag that causes this is -Wmissing-field-initializers , which is turned on as part of -Wextra . The simplest way to avoid this (bogus) warning is therefore to use -Wno-missing-field-initializers .

如果你不能忍受警告和/或不想禁用警告,那么我认为它必须通过例如memset显式初始化:

memset(&msg, 0, sizeof(msg));

maybe if you don't want to use default constructor you can simply use preprocessor functions like:

#ifdef LINUX
//init for linux
#endif

#ifdef WINDOWS
//init for windows
#endif

and so on

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM