GCC强制警告是一个错误:数组初始化程序中的多余元素

时间:2016-03-09 08:02:09

标签: gcc compiler-errors gcc-warning gcc4.7

我的项目必须使用两个不同的编译器进行编译。一个创建DLL(用于PC模拟,Mingw32-gcc-4.7.2)和另一个创建ELF(用于真实硬件)。两个编译器都有不同的行为,但我们希望它们尽可能相似,至少在出现错误时。 有一个特殊错误,我想在GCC中激活,这只是一个警告:

warning: excess elements in array initializer [enabled by default]

有没有办法只将此警告提升为错误?我只找到了激活一组警告的解决方案,但不仅仅是这一个。如果我没有弄错,组标志应该在括号中的警告消息后面:[默认启用] ...我不希望所有默认警告都是错误。

编辑:使用“-Werror = XXX”将其作为有效错误的标志是什么

1 个答案:

答案 0 :(得分:0)

tl; dr

-pedantic-errors似乎有用。

https://godbolt.org/z/BD2XTr

搜索路径

我也有同样的需求,但是一直找不到答案。当我发现这个问题还没有任何答案时,我决定深入研究GCC源代码。

一个简单的git grep 'excess elements in array initializer'告诉我警告是从gcc/c/c-typeck.c中的pedwarn_init()产生的。

该函数在同一文件的6375行中定义。

/* Issue a pedantic warning for a bad initializer component.  OPT is
   the option OPT_* (from options.h) controlling this warning or 0 if
   it is unconditionally given.  GMSGID identifies the message.  The
   component name is taken from the spelling stack.  */

static void ATTRIBUTE_GCC_DIAG (3,0)
pedwarn_init (location_t loc, int opt, const char *gmsgid, ...)
{
  /* Use the location where a macro was expanded rather than where
     it was defined to make sure macros defined in system headers
     but used incorrectly elsewhere are diagnosed.  */
  location_t exploc = expansion_point_location_if_in_system_header (loc);
  auto_diagnostic_group d;
  va_list ap;
  va_start (ap, gmsgid);
  bool warned = emit_diagnostic_valist (DK_PEDWARN, exploc, opt, gmsgid, &ap);
  va_end (ap);
  char *ofwhat = print_spelling ((char *) alloca (spelling_length () + 1));
  if (*ofwhat && warned)
    inform (exploc, "(near initialization for %qs)", ofwhat);
}

呼叫者以0的身份通过OPT。所以我认为没有办法将这个警告变成一个错误。但是我注意到函数中使用了DK_PEDWARNDK_PEDWARN的定义如下,

DEFINE_DIAGNOSTIC_KIND (DK_PEDWARN, "pedwarn", NULL)

但是没有-Wpedwarn。我知道有-pedantic。因此,以防万一我在GCC信息中搜索pedantic,请参见2.1节。 (强调我的)

2.1 C语言

[...]要在GCC中选择此标准,请使用以下选项之一 '-ansi','-std = c90'或'-std = iso9899:1990';获得所有 标准要求的诊断,还应指定 '-pedantic' (或“ -pedantic-errors”,如果您希望它们是错误的 *注意控制C语言的选项:C 方言选项。

它将把所有的ped脚警告都转换为错误,但是我认为它比-Werror更好。