Инициализировать членов структуры в 0 (gcc -Wextra)

Я хочу инициализировать все члены структуры в 0. Распространенным решением является сделать что-то вроде этого:

struct foo bar = {0}

Я создаю этот пример:

#include <stdio.h>

struct Stru2 {
int c;
int d;
};

struct Stru1 {
int a;
Stru2 b;
};

int main()
{
struct Stru1 aaa = { 0 };
return aaa.b.c;
}

И я компилирую (gcc 4.6.3) это с этими параметрами, чтобы убедиться, как ANSI справиться с этим

gcc -Wall -Wextra -pedantic -ansi main.cpp

И я получил следующие предупреждения:

main.cpp: In function ‘int main()’:
main.cpp:36:28: warning: missing initializer for member ‘Stru1::b’ [-Wmissing-field-initializers]

Вопрос в том, почему -Wextra, генерировать это предупреждение? Может не всегда «= {0}», установить для всех участников значение 0?

5

Решение

Это просто предупреждение няни .. = {0} определенно устанавливает все члены на ноль. Причина, по которой оно вообще включено в качестве предупреждения, заключается в том, что вы можете добавить поле в структуру и убедиться, что оно правильно инициализировано. Наличие предупреждения позволяет быстро найти эти места и исправить их. Например, допустим, вы исправили инициализатор, например:

struct Stru1 aaa = { 1, { 2, 3 } };

Теперь добавьте поле int e в Stru2:

struct Stru2 {
int c;
int d;
int e;
};

И давайте представим, что очень важно, чтобы e получить инициализацию. Ну без -Wmissing-field-initializersвам придется искать в своем коде, чтобы найти все места, которые вас интересуют. С предупреждением вы получаете диагностическое сообщение, подобное тому, которое вы видели, и вы можете легко найти и исправить его:

struct Stru1 aaa = { 1, { 2, 3, 4 } };

Чтобы получить преимущество этого предупреждения, вы должны пройти и полностью инициализировать все свои структуры. В вашем случае это означает что-то вроде:

struct Stru1 aaa = { 0, { 0, 0 } };
12

Другие решения

Да, {0} устанавливает для всех элементов структуры значение 0, поскольку для первого элемента устанавливается значение 0, а для всех остальных элементов по умолчанию установлено значение 0 до тех пор, пока хотя бы один элемент инициализирован. Увидеть Неинициализированные члены структуры всегда установлены в ноль?.

4

Это связано с Ошибка GCC # 53119, — Wmissing-braces ошибочно предупреждает об универсальном инициализаторе нуля {0}, но я думаю, что ваш вопрос указывает на то, что может быть по крайней мере еще один вариант предупреждения, добавляющий к проблеме. Размещение последующих сообщений в ветке об ошибках, вероятно, поможет решить проблему.

2
По вопросам рекламы [email protected]