Как гарантировать, что структуры полностью инициализированы (по имени) в GCC?
Как обеспечить, чтобы каждое поле моих структур инициализировалось в GCC при использовании назначенных инициализаторов? (Мне особенно интересны указатели на функции.) (Я использую C not С++.)
Вот пример:
typedef struct {
int a;
int b;
} foo_t;
typedef struct {
void (*Start)(void);
void (*Stop)(void);
} bar_t;
foo_t fooo = {
5
};
foo_t food = {
.b=4
};
bar_t baro = {
NULL
};
bar_t bard = {
.Start = NULL
};
-Индикаторы поля ввода ничего не помогают. Он работает только для fooo только в GCC (mingw 4.7.3, 4.8.1), а clang работает только немного лучше (никаких предупреждений для еды и барда).
Я уверен, что есть причина не создавать предупреждения для назначенного инициализатора (даже если я их явно прошу), но я хочу/нуждаюсь в них. Я не хочу инициализировать структуры на основе порядка/позиции, потому что это больше подвержено ошибкам (например, замена Start и Stop даже не дает предупреждения). И ни gcc, ни clang не будут предупреждать, что я не смог явно инициализировать поле (при инициализации по имени). Я также не хочу засорять мой код с if (x.y == NULL) строк по нескольким причинам, один из которых - это необходимость компиляции предупреждений времени, а не ошибок времени выполнения.
Как минимум splint предоставит мне предупреждения по всем 4 случаям, но, к сожалению, я не могу использовать splint все время (он задыхается на некотором коде (не удается разобрать некоторые расширения C99, GCC)).
Примечание. Если я использую реальную функцию вместо NULL GCC, также будет отображаться предупреждение для бара (но не барда).
Я искал google и переполнение стека, но только нашел связанные вопросы и не нашел ответа для этой конкретной проблемы.
Лучшее совпадение, которое я нашел, - "Убедитесь, что все элементы в структуре инициализированы"
Убедитесь, что все элементы в структуре инициализированы
Что задает почти тот же вопрос, но не имеет удовлетворительного ответа.
Есть ли лучший способ справиться с этим, о котором я не упомянул?
(Может быть, другой инструмент анализа кода? Предпочтительно что-то (бесплатное), которое может быть интегрировано в Eclipse или Visual Studio...)
Ответы
Ответ 1
Если я не ошибаюсь, стандарты C указывают, что другие поля автоматически инициализируются 0.
Итак, то, о чем вы просите - ошибка компиляции, когда поля не инициализированы, - не соответствует спецификации C (modern?).
Стандарт C99, стр. 127 в: http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или элементов совокупности или меньше символов в строковом литерале, используемом для инициализации массива известных размера, чем есть элементы в массиве, остальная часть совокупности должна быть инициализируется неявно так же, как и объекты, имеющие статическую продолжительность хранения.
gcc
-Wmissing-field-initializers
документируется, чтобы не предупреждать назначенные инициализаторы. Существует запрос на повышение -Wmissing-field-initializers=2
, которое затем предупредило бы также: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39589
Поэтому я предлагаю вам добавить свое желание в этот отчет об ошибке или даже предоставить патч. Из моего опыта использования программного обеспечения с открытым исходным кодом лучше всего добавить патч.
Ответ 2
Четыре способа, которыми вы показали, все инициализируют остальную часть структуры. Он инициализируется значением 0 (или эквивалентом типа).