问题
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?
回答1:
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, e.g. 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.,
回答2:
This should work:
memset(&msg, 0, sizeof(msg));
回答3:
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
.
回答4:
If you can't live with the warning and/or don't want to disable the warning, then I think it will have to be explicit initialisation via e.g. memset:
memset(&msg, 0, sizeof(msg));
回答5:
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
来源:https://stackoverflow.com/questions/4782628/how-should-i-properly-initialize-a-c-struct-from-c