Я создаю своего рода интерфейс для программы. Для запуска программы я использую вызов CreateProcess()
, который, помимо прочего, получает указатель на STARTUPINFO
структуру. Чтобы инициализировать структуру, которую я делал:
STARTUPINFO startupInfo = {0}; // Or even '\0'.
startupInfo.cb = sizeof(startupInfo);
При компиляции программы с включением этих наборов предупреждений GCC -Wall -Wextra
выдает предупреждение о том, что отсутствует инициализатор, указывающий на первую строку.
warning: missing initializer
warning: (near initialization for 'startupInfo.lpReserved')
В итоге я сделал:
STARTUPINFO startupInfo;
memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
Таким образом, компилятор не предупреждает. Вопрос в том, в чем разница между этими способами инициализации структуры? При использовании первого метода не инициализируется ли структура? Какой из них вы бы порекомендовали?
struct struct_with_four_fields x = {1, 2, 3};
когда инициализированы только 3 из 4 членов.{ 0 }
это общая и четко определенная идиома для инициализации всех членов в ноль (определенная рекурсивно для каждого под-члена) - вот почему более поздние версии gcc были изменены, чтобы не предупреждать об этом конкретном случае.obj = {0};
в сообщении, с которым вы связались, недействительна для C, и gcc 4.8.2 отклоняет ее как синтаксическую ошибку. Если вы компилируете как C ++, помните, что это другой язык, и gcc использует другой интерфейс; Исправления в компиляторе C gcc могут применяться или не применяться к g ++.Ответы:
GCC просто чрезмерно параноик - на мой взгляд, без всяких на то оснований, но, конечно, верно, что сопровождающие GCC знают намного больше о нюансах C, чем я.
См. Эту небольшую ветку обсуждения проблемы в списке рассылки GCC:
Суть в том, что инициализация структуры с помощью just
{0}
фактически будет нулем инициализировать все это.Стандарт C99 говорит следующее в 6.7.8 / 21 «Инициализация - Сематика»:
C90 говорит, по сути, то же самое, что и в 6.5.7, но с немного другой формулировкой (другими словами, C99 не добавил сюда ничего нового).
Также обратите внимание, что в C ++ это было расширено так, что пустой набор фигурных скобок «
{}
» будет выполнять инициализацию значения для объекта, потому что были ситуации (например, шаблоны), когда вы даже не знали, какие члены или сколько членов у типа должно быть. Так что это не только хорошая практика, но и иногда необходимо иметь список инициализаторов, который короче, чем количество членов, которые может иметь объект.источник
-Wno-missing-field-initializers
и-Wno-missing-braces
чтобы GGC перестал ныть, что я ставлю= {0};
для своих конструкций. Кто-нибудь знает, пропустит ли отключение этого предупреждения предупреждения для других вещей, кроме= {0};
структур?mingw32-g++.exe (GCC) 4.7.2
и получаю это предупреждение на идиоме выше (даже в точном случаеSTARTUPINFO
).{}
или{0}
инициализаторов в моих классах C ++: /Это можно легко исправить для GCC в программах на C ++, инициализировав структуру как
источник
Вы запросили как можно больше предупреждений, используя
-Wall -Wextra
.В этом случае вы получите предупреждение о том, что вы не указали все поля, что вполне допустимо, но могло быть непреднамеренным.
Вы можете подавить это предупреждение, добавив
-Wno-missing-field-initializers
источник
На этой веб-странице очень подробно обсуждается основная проблема: http://ex-parrot.com/~chris/random/initialise.html
В качестве временного решения мое текущее решение состоит в том, чтобы выборочно подавить это предупреждение:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wmissing-field-initializers" STARTUPINFO startupInfo = {0}; #pragma clang diagnostic pop
К сожалению, это работает только в clang и, похоже, не работает в GCC.
источник
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
принято компилятором GCC 4.2.1, но ничего не делать. неуверен в новых версиях gcc#pragma clang diagnostic ignored "-Wmissing-field-initializers"
. Вам, вероятно, следует проверить, так ли это.В C ++ вы можете использовать,
boost::initialized_value
чтобы избавиться от этого предупреждения. У меня отключены предупреждения дляboost
; поэтому я не знаю, вызовет ли это какие-либо другие предупреждения в вашем случае. Таким образом, вам не нужно отключать предупреждение.Пример:
источник