当结构初始化与结构类型定义不匹配时,如何让 GCC 给出错误消息?

How to get GCC to give an error-message when a structure initialization does not match the structure-type definition?

我有一个问题 gcc 当结构的初始化与其结构类型定义不匹配时不会生成错误——即使编译器应该是 运行在最挑剔的模式下。

以下命令由 make 在我称为 "developer mode" 中配置的包中调用 - 这是添加了一个选项,以便编译器将尽可能挑剔和娇气 - 从而让开发人员知道代码中有一些需要修复的东西。

gcc -Wall -Qunused-arguments -Werror -I./libchbclib/inc -I/Users/red_angel/chorebox_sys/include -c -o tmp/lchbclib/chbclib_strq_new.o ./libchbclib/csrc/chbclib_strq_new.c

它(目前)进行了所有编译和构建,没有错误,包括以下块引用....

static chbclib_strq_cl st_mainclass =
{
  st_meth_add // m_add
};

... 在包中其他位置的包含文件中引用以下结构....

typedef struct chbclib_strq_cl {
  bool (*m_add) ( void  *srf_aa, char *rg_a );
  // Adds a new string to the queue. Failure to do so is a
  // fatal-error to the program if the objects 'erat' value
  // is 0. Other wise, the boolean return value will let
  // the calling program know whether or not the operation
  // was a success.
} chbclib_strq_cl;

当然,到目前为止,构建没有错误是可以的。但是,当我对包含文件进行以下更改时,它 应该 生成错误 ----

typedef struct chbclib_strq_cl {
  bool (*m_add) ( void  *srf_aa, char *rg_a );
  // Adds a new string to the queue. Failure to do so is a
  // fatal-error to the program if the objects 'erat' value
  // is 0. Other wise, the boolean return value will let
  // the calling program know whether or not the operation
  // was a success.

  bool (*m_axd) ( void  *srf_aa, char *rg_a );
  // Adding this to the structure-type definition should produce
  // an error ---- but it doesn't.

} chbclib_strq_cl;

--- 但由于某些原因,它仍然 不会产生错误。

如果结构的初始化与结构类型定义不匹配,有什么方法可以强制 gcc 编译器生成错误?谢谢

当然 --- 你们中的一些人可能想知道为什么我抱怨错误消息 而不是 存在。答案是这样的——当我在非开发人员模式下构建包时,我可以接受错误不存在。但是,我实施了开发人员模式选项特别,因为我希望尽可能多地提醒我代码中的任何问题。

在这种情况下,示例是如果我有一个结构类型,该结构类型在程序的不同部分初始化了多个该类型的结构,并且我向该结构添加了一个字段(或进行任何其他更改) -type,我还需要在程序中初始化该类型结构的每个其他地方更新代码。但是,如果我在该更新中 "miss a spot" 怎么办?如果发生这种情况,我指望错误消息来提醒我。

那么 --- 当我在开发者模式下配置包时,如何让 gcc 满足这一重要需求?

您可能正在寻找 -Wmissing-field-initializers 选项。

使用-Wextra时默认启用。

来自 gcc 版本 4.8.2 联机帮助页:

   -Wmissing-field-initializers
       Warn if a structure's initializer has some fields missing.  For example, the following code causes such a warning, because "x.h" is implicitly zero:
               struct s { int f, g, h; };
               struct s x = { 3, 4 };
       This option does not warn about designated initializers, so the following modification
       does not trigger a warning:
               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.

使用此选项时,Clang 将比 GCC 更频繁地触发警告。如果 GCC 没有发出警告,请尝试使用 Clang 看看是否有变化。

对于 gcc 版本 4.8.2,在某些情况下不会触发警告(例如,当只有第一个字段初始化为零时),但也要注意,这取决于您使用的标准编译您的代码,第一个结构字段之前的未初始化结构字段可能作为有效 C 接受。