Да, они эквивалентны.
При настройках по умолчанию инициализация структуры компилируется без предупреждения. Если вы установили компилятор на 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 в статическую переменную.