Самый быстрый способ инициализировать массив структур для всех-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().