【问题标题】:Is it possible to make subset of warnings as errors是否可以将警告的子集作为错误
【发布时间】:2021-10-11 19:41:16
【问题描述】:

我正在尝试使用 c-preprocessor 预处理几个文件以使用 -Werror 扩展宏,我注意到在预处理时重新定义了错误。

fileA.h:203:0: error: "TEST_DIR" redefined
 #define TEST_DIR      2

fileB.h:119:0: note: this is the location of the previous definition
 #define TEST_DIR     90

fileC.h:203:0: error: "TEST_DIR" redefined
#define TEST_DIR_TASK                  1000


 fileD.h:119:0: note: this is the location of the previous definition
   #define TEST_DIR_TASK                  8

实际上TEST_DIR_TASK 在一个文件中以十六进制格式定义,在另一个文件中以十进制定义,这两个值表示相同,我想忽略这些。是否有任何特殊的 gcc 标志有助于根据某些标准忽略某些警告子集。谢谢!

【问题讨论】:

  • 十六进制的 8 是十进制的 8,所以这与这里看到的 1000 不匹配(也许你的意思是二进制?)。另外,如果其中任何一个是十六进制的,0x 前缀在哪里?

标签: c gcc makefile gnu-make


【解决方案1】:

GCC appears not to have a switch to disable this specific warning. 默认情况下,如果 GCC 有一个用于控制特定警告的命令行开关,它会包含在警告消息中。

使用 Clang,您可以使用 -Wno-macro-redefined 禁用重新定义宏的警告。 (当警告提升为错误时,这也会禁用此错误。)

【讨论】:

  • 我在您分享的 gcc 链接中找不到-Wno-macro-redefined
  • @Naga:正如我的回答所说,GCC 没有这个开关。 Clang 可以。
  • 好吧.. 从未听说过 Clang。它是如何工作的 ?以及我们如何设置它。
  • @Naga:Clang 是一种不同的编译器,它在很大程度上与 GCC 兼容。您需要在您的系统上安装它。信息是here
【解决方案2】:

我看不出290 可以如何表示相同的值,而不管它们各自的基数如何。

无论如何,如果您真的想重新定义它们(对我来说似乎是个坏主意),您总是可以先取消定义它们,例如:

// fileA.h
#undef TEST_DIR
#define TEST_DIR  2

// fileB.h
#undef TEST_DIR
#define TEST_DIR 90

或者如果它们真的是等价的并且第一个定义和最后一个定义一样好,您只能在尚未定义的情况下定义它们:

// fileA.h
#if !defined(TEST_DIR)
# define TEST_DIR 2
#endif

// fileB.h
#if !defined(TEST_DIR)
# define TEST_DIR 90
#endif

正如我所说,这似乎是一个非常糟糕的主意,只是要求将来出现各种故障,但它应该避免编译器警告/错误。

【讨论】:

  • 是的,有这样的重新定义是个坏主意。我们实际上想在我们现有的广泛代码中解决这些问题。正在检查 gcc 中的任何标志是否有帮助。
  • 没有这样的标志。我已经给出了避免警告/错误的选项。
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 2020-12-11
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
相关资源
最近更新 更多