Самый быстрый способ инициализировать массив структур со всеми 0? - PullRequest
24 голосов
/ 25 марта 2011

Я пытаюсь инициализировать массив структур со всеми 0, используя следующий синтаксис:

STRUCTA array[MAX] = {0};

Однако я получаю следующее предупреждение от gcc:

предупреждение: пропущены скобки вокруг инициализатора

Что я делаю не так - есть ли другой / лучший способ сделать это?

Ответы [ 6 ]

28 голосов
/ 25 марта 2011

Если первый член вашей структуры имеет скалярный тип, используйте

STRUCTA array[MAX] = {{ 0 }};

Если первым членом вашей структуры окажется другой объект структуры, первый член которого имеет скалярный тип, то вам придется использовать

STRUCTA array[MAX] = {{{ 0 }}};

и так далее. По сути, вы должны открывать новый уровень вложенных {} каждый раз, когда вы «вводите» другой вложенный агрегат (структуру или массив). Таким образом, в этом случае, поскольку первый член каждого вложенного агрегата также является агрегатом, вам нужно углубиться в {}.

Все эти дополнительные скобки есть только во избежание предупреждения. Конечно, это просто безобидное предупреждение (в данном конкретном случае). Вы можете использовать простой { 0 }, и он будет работать.

Вероятно, лучший способ справиться с этим - полностью отключить это предупреждение (правильный ответ в командной строке см. В ответе @ pmg). Кто-то, работающий над GCC, не думал ясно. Я имею в виду, я понимаю ценность этого предупреждения (и оно действительно может быть очень полезным), но нарушение функциональности { 0 } недопустимо. { 0 } должен был пройти специальный курс лечения.

8 голосов
/ 25 марта 2011

gcc - это неприятность.Следует принять это без предупреждений.
Попробуйте это

STRUCTA array[MAX] = {{0}};

Чтобы поведение gcc можно было контролировать с помощью опции -Wmissing-braces или -Wno-missing-braces.

-Wall, включающей это предупреждение.;чтобы иметь -Wall, но не отсутствующие скобки, используйте -Wall -Wno-missing-braces

5 голосов
/ 25 марта 2011

Это просто вредоносное предупреждение, выданное gcc, и я бы отключил его с помощью -Wno-braces. {0} - чрезвычайно полезный «универсальный инициализатор нуля» для типов, определение которых ваш код не должен знать, и gcc не одобряет его использование, активно вредное для поиска хорошего кода.

Если gcc хочет сохранить это предупреждение, оно должно по крайней мере в особом случае {0} и отключить предупреждение в этом одном случае.

1 голос
/ 25 марта 2011

Зависит от СТРУКТЫ.Например:

typedef struct structa 
{
    int a, b;
} STRUCTA;

int main (int argc, char const* argv[])
{
    STRUCTA array[10] = {{0,0}};
    return 0;
}
1 голос
/ 25 марта 2011

Массивы инициализируются фигурными скобками, но также являются структурами.Возможно, вам понадобится установить дополнительные скобки вокруг 0 ​​и, в зависимости от того, как определен STRUCTA, некоторые дополнительные 0 разделены запятыми.

0 голосов
/ 25 марта 2011

Можно ли присвоить STRUCTA значение 0?

Вы также всегда можете использовать memset ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...