GCC просто чрезмерно параноидален - на мой взгляд, без веской причины, но, конечно, верно, что сопровождающие GCC знают гораздо больше о нюансах C, которые я делаю.
Смотрите эту небольшую ветку обсуждения проблемы в списке рассылки GCC:
Суть в том, что инициализация структуры с помощью {0}
фактически приведет к нулю инициализации всего объекта.
Стандарт C99 гласит следующее в 6.7.8 / 21 «Инициализация - сематика»:
Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или членов совокупности или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементов в массиве, оставшаяся часть агрегат должен быть инициализирован неявно так же, как объекты, которые имеют статическую продолжительность хранения.
C90 говорит о том же в 6.5.7 с немного другой формулировкой (другими словами, C99 здесь не добавил чего-то нового).
Также обратите внимание, что в C ++ это было расширено, так что пустой набор фигурных скобок, "{}
", будет выполнять инициализацию значения для объекта, потому что были ситуации (например, шаблоны), когда вы даже не знали, какие члены или сколько членов может иметь тип. Так что это не только хорошая практика, но иногда необходимо иметь список инициализаторов, который короче, чем число членов, которое может иметь объект.