Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/35: Рейтинг темы: голосов - 35, средняя оценка - 4.60
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
1

Предупреждение "missing initializer" для структур в gcc

15.12.2011, 12:59. Показов 6499. Ответов 7

Author24 — интернет-сервис помощи студентам
Допустим имеется следующий код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
struct some {
        int a;
        int b;
};
 
int main() {
        struct some s = { 0 };
        printf("%d %d\n", s.a, s.b);
 
        return 0;
}
Ничего особенного в нем нет. И на мой взгляд он абсолютно корректен.

Компилируем с помощью gcc: gcc -W main.c И как результат получаем:
Код
a.c: In function ‘main’:
a.c:9: warning: missing initializer
a.c:9: warning: (near initialization for ‘s.b’)
Что? Почему? Какое еще предупреждение. Я, конечно, прекрасно понимаю, что gcc хочет видеть здесь что-то подобное struct some s = { 0, 0 }; Но разве так должно быть?

Поковырял стандарт, нашел следующее:
If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
Вопрос, собственно в том, как с этим бороться? Предупреждение явно лишнее. В доках по gcc обнаружен флаг -Wno-missing-field-initializers, который полностью убирает подобное предупреждение.
-Wmissing-field-initializers
Warn if a structure's initializer has some fields missing. For example, the following code would cause such a warning, because x.h is implicitly zero:
C
1
2
struct s { int f, g, h; };
struct s x = { 3, 4 };
This option does not warn about designated initializers, so the following modification would not trigger a warning:

C
1
2
struct s { int f, g, h; };
struct s x = { .f = 3, .g = 4 };
This warning is included in -Wextra. To get other -Wextra warnings without this one, use `-Wextra -Wno-missing-field-initializers'.
Но, имхо, не комильфо
Есть ли способы победить ворнинг только для случая { 0 }? Хотя это тоже будет противоречить стандарту, но я никогда не использую неполные списки инициализации. Либо полный, либо нулевой - тупо чтобы обнулить все поля структуры. Что скажете, господа?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2011, 12:59
Ответы с готовыми решениями:

warning: missing braces around initializer
Здравствуйте, помогите исправить проблему: При компиляции все работает, но выводится: lab10.h:...

missing braces around initializer - чьо такое?
Проект в студию Студии при компиляции выдает предупреждение, смысл которого не могу понять. Вот...

Предупреждение о Extended initializer lists
При использовании функции nanosleep при компиляции g++ выводит следующее: ex.cpp: В функции «void*...

Инициализация массива структур: Array initializers can only be used in a variable or field initializer
В С++ можно создать массив стркутур и тут же ее проинициализировать: struct AmplPalette ...

Предупреждение AVG-GCC
Прошу помочь/подсказать. Осваиваю avr-gcc. Простая функция и все работает = // Готовность...

7
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
15.12.2011, 13:45 2
вполне справедливое предупреждение - не найден инициализатор для второго члена.

Цитата Сообщение от fasked Посмотреть сообщение
Есть ли способы победить ворнинг только для случая { 0 }?
да. добавить конструктор.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
15.12.2011, 14:39  [ТС] 3
Цитата Сообщение от niXman Посмотреть сообщение
да. добавить конструктор.
Си же, без плюсов.
Цитата Сообщение от niXman Посмотреть сообщение
вполне справедливое предупреждение - не найден инициализатор для второго члена.
Не по стандарту же. К тому же прием дико популярный. Как без него жить-то?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
15.12.2011, 14:46 4
Неполные списки инициализации соответствуют Стандарту, компилятор при этом должен руководствоваться 8.5.1 clause 7.
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
15.12.2011, 15:01  [ТС] 5
Цитата Сообщение от CheshireCat Посмотреть сообщение
Неполные списки инициализации соответствуют Стандарту, компилятор при этом должен руководствоваться 8.5.1 clause 7.
Спасибо, нашел.
Common Warnings
An aggregate has a partly bracketed initialization
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
15.12.2011, 15:33 6
А, для Си без плюсов это 6.7.8/21
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
15.12.2011, 16:12 7
Цитата Сообщение от fasked Посмотреть сообщение
Си же, без плюсов.
не обратил внимания.

Добавлено через 54 секунды
fasked, а на каком компиляторе ты этот варнинг получил?
http://liveworkspace.org/code/... e8ee0e9c97
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
15.12.2011, 16:19  [ТС] 8
Цитата Сообщение от niXman Посмотреть сообщение
а на каком компиляторе ты этот варнинг получил?
Совсем забыл сказать Пробовал на двух:
gcc version 3.4.4 (Wind River Linux)
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

Ворнинг включается ключом -Wextra. Как оказалось на gcc 3.4.4 нет ключа -Wno-missing-field-initializers, так что видимо придется обойтись без Wextra
0
15.12.2011, 16:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2011, 16:19
Помогаю со студенческими работами здесь

Странное предупреждение GCC
В функции есть строчки и компилятор ругается на последнуюю: char *p = NULL; ...

[c++] gcc, почему не подавляется предупреждение компилятора?
Привет! Почему не подавляется предупреждение? https://rextester.com/HWHJ72731 #include...

GCC компилятор, выборочно отключить предупреждение
Обновил компилятор, теперь в новом GCC по умолчанию, при включенном ключе &lt;-Wall&gt; есть такое...

GCC Сборка 32 разрядной версии GCC 64 разрядным GCC
Доброго времени суток. Возникла необходимость под 32х разрядный Linux, собрать 32 разрядный GCC. Но...

[gcc] отказался подавлять предупреждение -Wunused-function
добрый день. есть подозрение на баг в компиляторах gcc. (воспроизводил на разных версиях) ...

Некорректное ли предупреждение gcc о явно запрещенном конструкторе?
Здравствуйте! У меня есть класс Uncopyable, который явно запрещает копирование. От него наследую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru