【问题标题】:Why macro redefined error occurs only when value is different and Macro name is same?为什么只有当值不同且宏名称相同时才会出现宏重新定义错误?
【发布时间】:2016-08-16 08:03:46
【问题描述】:
我发现下面的宏定义在第三方库之一的两个头文件中
# define RATES_BALANCE_SCALER 1000000
迄今为止没有出现错误,但是当我在一个文件中更改该宏的值时,开始出现以下错误
error: "RATES_BALANCE_SCALER" redefined [-Werror]
注意:在编译中已将警告设置为错误。
那么请您确认一下我对编译器的理解是对还是错?
宏替换在预处理时完成,因此在预处理时
找到具有不同值的同名宏然后它将替换宏
带有稍后添加的头文件的值并生成错误/警告
对吗?
现在当 MACRO 名称和值都相同时,编译器不会
生成由稍后的宏完成的任何错误/警告和替换
添加头文件对吗?如果正确那么为什么在这种情况下
编译器没有产生警告或错误?
【问题讨论】:
标签:
c
macros
c-preprocessor
【解决方案1】:
它们具有相同的名称,因此您要更改的是同一个宏。但它存在于两个文件中。只要值相同就没有问题,但是当您更改值时,编译器无法确定哪个是“正确”的。这会导致冲突。尽量不要在多个文件中定义一个值。但如果有必要放
#ifndef RATES_BALANCE_SCALER
#define RATES_BALANCE_SCALER 1000000
#endif
因此,如果该值已定义,则不会重新定义。
edit:如果先定义了第三方宏,这将导致值不变!如果您需要该值,请将其命名为不同的名称
【解决方案2】:
将相同的事物定义为两个不同的事物应该是一个编程错误。这就是当您以不同方式重新定义它时编译器会发出错误的原因。编译器支持#undef 它并以不同方式重新定义,但对于重新定义宏替换的含义尚未达成共识。
好的编译器在将宏重新定义为不同的东西时应该发出错误,并在多次执行时发出警告(对同一个字符串)但是,因为有很多遗留代码只是在几个地方重新定义相同的常量以确保你最后得到定义,通常编译器对此保持沉默。