【问题标题】:In eclipse treat macro redefinition as an error rather than a warning在 Eclipse 中,将宏重新定义视为错误而不是警告
【发布时间】:2020-04-25 10:23:06
【问题描述】:

C++

我知道有些/大多数人会说将所有警告都视为错误,但我正在使用的代码库目前不可行。 我有两个由外部工具生成的头文件,其中包含我需要访问的一些硬件的地址。 例如

header1.h

#define address1 0x123

header2.h

#define address1 0x123

上述情况并不理想,但很好,在这种情况下预处理器不会产生警告。但是,如果第二个宏定义不同,我希望它标记错误而不是警告。 在 Eclipse 中,如果我将 address1 的第二个定义更改为不同,我将收到如下警告:

'地址1重新定义[默认启用]'

我找不到可用于将此视为错误的警告编号或开关。

【问题讨论】:

  • C 和 C++ 是两种不同的语言。看来您实际上是用 C++ 编写的,所以请删除 c 标签
  • 您希望编译器在构建时给您一个错误,或者您希望 Eclipse 在您构建之前向您显示错误?
  • 问题的根源是外部工具。建议使用外部工具,当它生成header2.h 时生成:#define address2 0x123 或者不要在同一个编译单元中包含两个头文件

标签: c++ eclipse


【解决方案1】:

如果一个标头将地址定义为0x123,另一个定义为0x234,那么如果两个标头都包含在一个翻译单元中,您将收到重新定义的宏警告或错误。 (我使用 GCC 的 -Werror 进行编码,所以这对我来说肯定是一个错误——它将所有警告转换为错误,在我看来,它是一个很好的纪律;你必须有无警告的代码才能让它编译.) 如果默认情况下启用警告,您可以使用-Werror 将其转换为错误,但您不会获得-Werror=missing-prototypes 或其他的选择性。

如果您需要保持值同步,请在一个标头中定义地址(例如header1.h)并让另一个标头(header2.h)包含第一个。这可以被视为格言 DRY(不要重复自己)或 ODR(一个定义规则——尽管它更多地用于外部符号而不是宏定义)或其他各种名称的应用。

如果不这样做,在某些模块中,包含两个标题,这样如果你弄错了,事情就会失败(值不同)。标头在您的构建系统中提供交叉检查,并且至关重要。

【讨论】:

  • 感谢您抽出宝贵时间回复。为了概括这个问题,我正在处理的警告不显示标志或错误号,它只是说默认情况下启用,没有 -Wxxx ,就像我期望的那样。如果我有标志,我可以执行 -Werror=xxxx 并将此警告视为错误。我不知道为什么这个特定的警告没有标志,以及我能做些什么来获得这个特定警告的标志
  • 它没有启用标志,因为它被认为是强制性的。恐怕你会被-Werror 将所有警告转换为错误,我实际上认为这是一个好主意,因为它可以防止你使用有警告的代码。没有-Werror,我不会编译我自己的代码。我有时会在“来自 SO 的代码”的不良情况下抑制它(但我在答案中发布的代码通常是干净的)。有 30 多年的遗留问题阻止我在工作中的所有代码上使用它,但我负责的部分主要在启用 -Werror 的情况下编译(但不是我想要的所有支持警告) .
  • 我对此感到害怕,但怀疑它可能是强制性的,尽管我希望即使无法禁用它,我也可以将其从警告更改为错误。因为我使用的是遗留代码,所以我无法将所有警告都转换为错误。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 2016-03-28
  • 1970-01-01
  • 2011-01-05
相关资源
最近更新 更多