它看起来像一个 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 不会。