Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在eclipse中,将宏重新定义视为错误而不是警告_C++_Eclipse - Fatal编程技术网

C++ 在eclipse中,将宏重新定义视为错误而不是警告

C++ 在eclipse中,将宏重新定义视为错误而不是警告,c++,eclipse,C++,Eclipse,C++ 我知道有些人/大多数人会说将所有警告视为错误,但对于我正在使用的代码库,这目前是不可行的。 我有两个由外部工具生成的头文件,其中包含我需要访问的某些硬件的地址。 e、 g 校长1.h #定义地址1 0x123 校长2.h #定义地址1 0x123 上述情况并不理想,但很好,在这种情况下,预处理器不会生成警告。但是,如果第二个宏定义不同,我希望它标记错误而不是警告。 在Eclipse中,如果我将address1的第二个定义更改为不同的,我将得到如下警告: '重新定义地址1[默认启用]' 我

C++

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

校长1.h

#定义地址1 0x123

校长2.h

#定义地址1 0x123

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

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


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

如果一个标题将地址定义为
0x123
,另一个标题定义为
0x234
,则如果两个标题都包含在一个翻译单元中,您将得到重新定义的宏警告或错误。(我用GCC的
-Werror
编码,所以这对我来说肯定是一个错误-它将所有警告转换为错误,在我看来,它是一个很好的规则;你必须有无警告代码才能编译它。)如果警告在默认情况下启用,你可以用
-Werror
将其转换为错误,但是你没有得到
-Werror=缺少原型的选择性

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


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

C和C++是两种不同的语言。看起来你实际上是在C++中写的,所以请删除<代码> C<代码> TAGU,希望编译器在编译时给你一个错误,或者你希望Eclipse在你构建之前显示错误?问题的来源是外部工具。当外部工具生成
header2.h
时,建议使用该工具生成:
#定义地址2 0x123
或不要在同一编译单元中同时包含两个标题谢谢您花时间回复。概括地说,我处理的警告没有显示标志或错误号,它只是说默认情况下启用了no-Wxxx,这与我预期的一样。如果我有这个标志,我可以执行-Werror=xxxx并将此警告视为错误。我不明白为什么这个特定的警告没有标志,我能做什么来获得这个特定警告的标志它没有启用标志,因为它被认为是强制性的。我担心,您被
-Werror
将所有警告转换为错误所困扰,实际上我认为这是一个好主意,因为它阻止您使用带有警告的代码。没有
-Werror
,我不会编译自己的代码。我有时会因为“来自SO的代码”的糟糕情况而抑制它(但我在答案中发布的代码通常是干净的)。有30多年的遗留问题阻止我在工作中的所有代码上使用它,但我负责的部分大多是在启用了
-Werror
的情况下编译的(但不是在我想要的所有支持警告的情况下)我很害怕,但怀疑它可能是强制性的,尽管我希望即使我不能禁用它,我也能将它从警告改为错误。因为我使用的是旧代码,所以无法将所有警告转换为错误。非常感谢。