Самый быстрый способ инициализировать массив структур для всех-0?
Я пытаюсь инициализировать массив структур для all-0, используя следующий синтаксис:
STRUCTA array[MAX] = {0};
Однако, я получаю следующее предупреждение от gcc:
предупреждение: отсутствующие фигурные скобки вокруг инициализатора
Что я делаю неправильно - есть ли другой/лучший способ сделать это?
Ответы
Ответ 1
Это первый член вашей структуры имеет скалярный тип, используйте
STRUCTA array[MAX] = {{ 0 }};
Если первый член вашей структуры является другим структурным объектом, чей первый член имеет скалярный тип, тогда вам придется использовать
STRUCTA array[MAX] = {{{ 0 }}};
и т.д. В принципе, вам нужно открыть новый уровень вложенных {}
каждый раз, когда вы "enter" еще один вложенный агрегат (структура или массив). Поэтому в этом случае, если первый член каждого вложенного агрегата также является совокупным, вам нужно глубже пройти {}
.
Все эти дополнительные фигурные скобки доступны только для предупреждения. Конечно, это просто безобидное предупреждение (в данном конкретном случае). Вы можете использовать простой { 0 }
, и он будет работать.
Вероятно, лучший способ справиться с этим - полностью отключить это предупреждение (см. @pmg answer для правильной опции командной строки). Кто-то, кто работает над GCC, не думал четко. Я имею в виду, я понимаю значение этого предупреждения (и это действительно может быть очень полезно), но нарушение функциональности { 0 }
неприемлемо. { 0 }
должно быть предоставлено специальное лечение.
Ответ 2
gcc является неприятностью. Он должен принять это без предупреждений.
Попробуйте это
STRUCTA array[MAX] = {{0}};
Это поведение gcc можно контролировать с помощью опции -Wmissing-braces
или -Wno-missing-braces
.
-Wall
позволяет это предупреждение; чтобы иметь -Wall
, но не отсутствующие фигурные скобки, используйте -Wall -Wno-missing-braces
Ответ 3
Это просто вредное предупреждение, выпущенное gcc, и я отключу его с помощью -Wno-braces
. {0}
- чрезвычайно полезный "универсальный нулевой инициализатор" для типов, определение которых ваш код не должен знать, и gcc, обескураживающий его использование, активно вредит поиску хорошего кода.
Если gcc хочет сохранить это предупреждение, он должен по крайней мере в специальном случае {0}
и отключить предупреждение в этом случае.
Ответ 4
Массивы инициализируются скобками, но также являются структурами. Вероятно, вам нужно добавить дополнительный набор фигурных скобок вокруг вашего 0 и, в зависимости от того, как определяется STRUCTA
, некоторые дополнительные 0 разделены запятыми.
Ответ 5
Это зависит от STRUCTA. Например:
typedef struct structa
{
int a, b;
} STRUCTA;
int main (int argc, char const* argv[])
{
STRUCTA array[10] = {{0,0}};
return 0;
}
Ответ 6
Может ли STRUCTA присваиваться 0?
Вы всегда можете использовать memset().