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

时间:2015-03-09 21:26:19

标签: c gcc data-structures

当结构的初始化与其结构类型定义不匹配时,我有一个 gcc 没有生成错误的问题 - 即使编译器被认为可能以最挑剔的模式运行。

在我称之为“开发者模式”的配置包中的 make 调用以下命令 - 这是一个选项被添加,以便编译器将是挑剔的并且尽可能地娇气 - 从而让开发人员知道代码中有一些东西需要修复。

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 编译器生成错误?感谢。

当然---你们中的一些人可能想知道我为什么抱怨错误消息而不是存在。答案是这样的 - 当我在非开发者模式下构建软件包时,我没有错误,因为错误不在那里。但是,我实现了developer-mode 特别是的选项,因为我希望尽可能地收到代码中任何问题的警告。

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

那么---当我在开发人员模式下配置包时,如何才能满足这一重要需求 gcc

1 个答案:

答案 0 :(得分:0)

您可能正在寻找-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接受。