Это похоже на "ошибку согласованности" gcc, вот соответствующий фрагмент кода в gcc/c/c-typeck.c
7436 /* Warn when some struct elements are implicitly initialized to zero. */
7437 if (warn_missing_field_initializers
7438 && constructor_type
7439 && TREE_CODE (constructor_type) == RECORD_TYPE
7440 && constructor_unfilled_fields)
7441 {
7442 bool constructor_zeroinit =
7443 (vec_safe_length (constructor_elements) == 1
7444 && integer_zerop ((*constructor_elements)[0].value));
7445
7446 /* Do not warn for flexible array members or zero-length arrays. */
7447 while (constructor_unfilled_fields
7448 && (!DECL_SIZE (constructor_unfilled_fields)
7449 || integer_zerop (DECL_SIZE (constructor_unfilled_fields))))
7450 constructor_unfilled_fields = DECL_CHAIN (constructor_unfilled_fields);
7451
7452 if (constructor_unfilled_fields
7453 /* Do not warn if this level of the initializer uses member
7454 designators; it is likely to be deliberate. */
7455 && !constructor_designated
7456 /* Do not warn about initializing with ` = {0}'. */
7457 && !constructor_zeroinit)
7458 {
7459 if (warning_at (input_location, OPT_Wmissing_field_initializers,
7460 "missing initializer for field %qD of %qT",
7461 constructor_unfilled_fields,
7462 constructor_type))
7463 inform (DECL_SOURCE_LOCATION (constructor_unfilled_fields),
7464 "%qD declared here", constructor_unfilled_fields);
7465 }
7466 }
Цель кода, по-видимому, состоит в том, чтобы предупредить, если какой-либо конструктор атрибута имеет незаполненное поле. Тот факт, что вы не получаете предупреждение об элементе «a», вероятно, является «ошибкой согласованности».
Если -Wextra
предназначено для включения предупреждения об отсутствующих инициализаторах, то оно есть. Вопрос в том, должно ли «предупреждение об отсутствующих инициализаторах» исключать пропущенные атрибуты? Кажется, что gcc и clang не согласны с этим - и может быть, для них это нормально?
Возможно, это не тот ответ, который вы ищете... но надеюсь, что он поможет вам понять ситуацию. :). У команды GCC есть ошибка согласованности, но намерение их кода, кажется, предупреждает в этих случаях, тогда как clang, эмпирически, не будет.
person
Andrew Atrens
schedule
11.02.2020
a
при этом нет. Это несоответствие указывает на ошибку. Чтобы сообщить об этом команде GCC, вы можете отказаться от заголовка иprintf()
и сделать его общей функцией, а неmain
, чтобы ваш предварительно обработанный код был минимальным. Я тоже скомпилировал с-std=c11
, а не с-std=c99
. - person Jonathan Leffler   schedule 03.03.2018a
, а также нет предупреждения, если составной литерал применяется к последнему членуstruct
- person David Ranieri   schedule 03.03.2018struct T t = {.b = &t.a };
не генерирует предупреждение. Одноэлементного массива (составной литерал) также достаточно. Также кажется, что это только элемент после инициализированного составным литералом. Добавьтеint d;
послеc
, и жалоб наd
не будет. (Добавьте больше целых чисел до или после, и жалоба будет по-прежнему только на один элемент после составного литерала.) - person Jonathan Leffler   schedule 03.03.2018struct T { int a; int *b; int c; int *e; /* int f; */ };
иstruct T t = {.b = ((int []){1, 1}), .e=((int []){2,3})};
этого не будет. Но удалите комментарий, он будет больше оe
, а не оb
. - person user2736738   schedule 03.03.2018struct T { int a; int *b; int c; }; struct T foo(int bar); struct T foo(int bar) { struct T t = {.b = (int[]){1}}; t.c = bar; return t; }
, который можно предварительно обработать, не делая ничего, кроме добавления директив for#line
(за исключением того, чтоline
опущено). Что делает воспроизведение близким к минимальному. Я компилирую сgcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -c diw71.c
('diw' — предупреждение назначенных инициализаторов; выберите свое имя). - person Jonathan Leffler   schedule 03.03.2018gcc
!. (S) он мог бы дать лучший обзор по этому поводу. - person user2736738   schedule 03.03.2018#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
в качестве (временного) обходного пути. - person Will   schedule 19.07.2019