Как инициализировать массив символов при объявлении - PullRequest
2 голосов
/ 22 июня 2010

Эти 2 метода эквивалентны?

char a[10] = "";
char a[10] = { 0 };

Кроме того, я хотел бы объявить-инициализировать структуру, но это не сработает в gcc:

struct c
{
    char d[10];
    int e; 
};
struct c f = { 0 };

ac: In function'главный':ac: 33: предупреждение: отсутствуют скобки вокруг инициализатораac: 33: предупреждение: (близка к инициализации 'f.d')ac: 33: предупреждение: отсутствует инициализаторac: 33: предупреждение: (около инициализации для 'f.e')ac: 33: предупреждение: неиспользуемая переменная 'f'

Ответы [ 4 ]

6 голосов
/ 22 июня 2010

Да, две инициализации char [] идентичны - обе инициализируют массив, содержащий нули.

В случае проблемы со структурой попробуйте:

struct c f = { {0}, 0 };

(В более новых версияхgcc, поддерживающий C99, вы также можете назвать элементы инициализируемой структуры. )

5 голосов
/ 22 июня 2010
  1. Да, они эквивалентны.

  2. При настройках по умолчанию инициализация структуры компилируется без предупреждения. Если вы установили компилятор на fussy, вам нужно указать строку (любую из двух форм в вашем первом вопросе) и целое число:

    struct c
    {
        char d[10];
        int e; 
    };
    struct c f = { "", 0 };
    struct c g = { { 0 }, 0 };
    

Что означает «суетливый»:

Osiris-2 JL: cat x.c
struct c
{
    char d[10];
    int e; 
};
struct c f = { 0 };
Osiris-2 JL: gcc -c x.c
Osiris-2 JL: gcc -Wall -c x.c
x.c:6: warning: missing braces around initializer
x.c:6: warning: (near initialization for ‘f.d’)
Osiris-2 JL: gcc -O -Wall -c x.c
x.c:6: warning: missing braces around initializer
x.c:6: warning: (near initialization for ‘f.d’)
Osiris-2 JL: gcc -O -Wextra -Wall -c x.c
x.c:6: warning: missing braces around initializer
x.c:6: warning: (near initialization for ‘f.d’)
x.c:6: warning: missing initializer
x.c:6: warning: (near initialization for ‘f.e’)
Osiris-2 JL: 

В этом контексте GCC 'set fussy' означает добавление таких опций, как '-Wall' и '-Wextra', чтобы получить больше предупреждений, чем того требует стандарт C, который компилируется GCC. Поскольку я не указал, какой стандарт работает, он соответствует стандарту GNU-99 (-std=gnu99).

Чтобы получить сообщение «неиспользуемая переменная» из вопроса, мне пришлось бы преобразовать переменную f в статическую переменную.

1 голос
/ 22 июня 2010

Да, первые две инициализации эквивалентны.

Вторая инициализация будет работать в GCC.Ваш код совершенно корректен.На языке C { 0 } - это Universal Zero Initializer , который можно использовать практически с любым типом.Это старая и очень устоявшаяся идиома.Что вы получаете от GCC - это просто предупреждений , отправленных кем-то, кто принял довольно невежественное решение вмешаться в работу Universal Zero Initializer .

[rant] GCC в последнее время в некотором отношении идет на спад. [/ Rant] Я понимаю их общее намерение, но конкретная форма { 0 } должна была рассматриваться как исключение без предупреждений.

1 голос
/ 22 июня 2010

1) Да, они эквивалентны.2) Попробуйте

struct c f = { "", 0 }

Вы должны инициализировать оба значения.Я помню, что у меня тоже были проблемы, вы можете попробовать

struct c f = (struct c){ "", 0 }

, если он не работает.

См. эту страницу тоже.

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