Хорошо, это имеет смысл, спасибо за разъяснения.

я есть следующий код в файле C ++:

#include <sys/socket.h>

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

Когда я собираю сg++ с помощью-Wall -WextraЯ получаю предупреждения:

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

Моя проблема заключается в следующем: я не могу явно инициализировать все поля, потому что я не знаю, какие поля будут существовать (кросс-платформенные) вstruct msghdr, Структура не имеет конструктора по умолчанию, так как это структура C. У меня сложилось впечатление, что= {0} форма привела к нулевой инициализации всех полей (что было бы хорошо для меня), ноg++ Сообщение об ошибке предполагает, что нет.

Какие у меня есть варианты?

Ответы на вопрос(1)

Решение Вопроса
void someFunc()
{
    msghdr msg = {};  // <<< All members zero-initialized
}

-Wextra Уровень предупреждения ИМХО не очень полезен.

Код, который у вас есть, также формально подходит для "C struct", в стандарте, известном как POD (Plain Old Data). Но ваш код явно инициализирует первый член с 0. Это не обязательно будет работать для агрегата, который не является POD, например сstd::string в качестве первого члена, в то время как чистый{} будет работать и для этого.

Попутно, часто POD, такой как тот, с которым вы имеете дело, имеет количество байтов в качестве первого члена, и тогда вы можете сделать как ...

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

Возможно добавитьSTATIC_ASSERT что элемент подсчета байтов является первым (со смещением 0).

Ура & hth.,

 Tim Martin24 янв. 2011 г., 14:54
Спасибо за ввод Альф, приятно знать, что это-Wextra это сломано и не мое понимание C ++ :-)
 Cheers and hth. - Alf24 янв. 2011 г., 14:52
@peoro: хорошо. Я добавил «ИМХО». :-)
 peoro24 янв. 2011 г., 14:48
Я не согласен с предложениемУровень предупреждения g ++ -Wextra не очень полезен.

Ваш ответ на вопрос