[c++, gcc] initialize struct with {0}
это не поможет?
-Wmissing-field-initializers
Warn if a structure's initializer has some fields missing. For example, the following code would cause such a warning, because x.h is implicitly zero:
struct s { int f, g, h; };
struct s x = { 3, 4 };
This option does not warn about designated initializers, so the following modification would not trigger a warning:
struct s { int f, g, h; };
struct s x = { .f = 3, .g = 4 };
This warning is included in -Wextra. To get other -Wextra warnings without this one, use `-Wextra -Wno-missing-field-initializers'.
как заметил предыдущий оратор, можно писать {.a = 0}, и варнинга не будет. хотя да, я понимаю, что распознавать '= {0}' как идиому было бы неплохо. можешь попробовать написать багрепорт!
Глобальные данные (или как они по науке называются, не помню точно) инициализируются нулями, автоматические нет. Можешь юзать это свойство, можешь нет. В любом случае, если тебе надо проинициализировать все поля, тебе надо это делать руками и если ты ошибешься и проинициализуешь не все, то для автоматических это скорее всего ошибка, а для глобальных писать = {0[0)*]} смысла нет. (в случае глобальные ненулевых тоже скорее всего ошибка)
зы ну и как было замечено предыдущими ораторами с помощью поименованной инициализации ты можешь выполнить любой свой каприз, если ты действительно уверен в том, что ты делаешь)
имхо нормальный ворнинг, просто надо понять, что '={0}' - это НЕ 'заполнить все нулями'. И, насколько я знаю, синтаксиса для инициализации 'заполнить все нулями' нет.В 8.5.1.7 приведен такой синтаксис. И, упс, '={0}' - его частный случай.
имхо нормальный ворнинг, просто надо понять, что '={0}' - это НЕ 'заполнить все нулями'. И, насколько я знаю, синтаксиса для инициализации 'заполнить все нулями' нет.ну ладно тебе лень прочитать стандарт с++
но мое первое сообщение ты почему не прочитал?
я же там прям явно написал что по стандарту b станет нулем
я редко обращаю внимание на детали, поэтому не заметил еще и отсутствие слова struct в листинге (.
Почему-то по стилю кода мне даже не пришло в голову, что это о плюсах...
Только после (неудачных попыток найти в стандарте пункт 8.5.1.7,засада обнаружилась)
19 The initialization shall occur in initializer list order, each initializer provided for a particular subobject overriding any previously listed initializer for the same subobject, all subobjects that are not initialized explicitly shall be initialized implicitly the same as objects that have static storage duration.
10 If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these rules.
— if it is a union, the first named member is initialized (recursively) according to these rules.а вот это, кстати, интересно. Типа
union { char x; int y; } z;
y — не определен?
Оставить комментарий
pitrik2
стандарт говорит, чтов данном случае b будет проинициализировано в 0
gcc же на это выдает: "warning: missing initializer for member 'MyStruct::b'"
вот тут написано что это появилось в 98 году и чем это плохо: http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00031.html
плохо тем что выдается один и тот же ворнинг в случае если структура вообще не проинициализирована и если она проиницииализирована нулями
вопрос
с 98 года это поправили?
может быть можно эти два случая теперь какой-нибудь опцией различать?
P.S.
у меня gcc 4.4.3