为什么只有当值不同且宏名称相同时才会出现宏重新定义的错误?

时间:2016-08-16 08:03:46

标签: c macros c-preprocessor

我在下面找到了在第三方库

之一的两个头文件中定义的宏
# define RATES_BALANCE_SCALER                  1000000

迄今为止没有出现错误,但是当我在一个文件中更改该宏的值时,则开始跟随错误

error: "RATES_BALANCE_SCALER" redefined [-Werror]

注意:编译时将警告设置为错误。

所以,请你确认我对编译器的正确与否有以下理解吗?

  1. MACRO替换在预处理时完成,所以当预处理器时 找到具有不同值的同名宏,然后它将替换宏 值后面添加头文件,并生成错误/警告 右

  2. 现在,当MACRO名称和值都相同时,编译器就不会     生成任何错误/警告,并由以后的宏完成替换     添加头文件吧?如果那么为什么在这种情况下     编译器没有生成警告或错误?

2 个答案:

答案 0 :(得分:1)

它们具有相同的名称,因此它与您正在更改的宏相同。但它存在于两个文件中。只要值相同就没有问题,但是当您更改值时,编译器无法确定哪一个是"对"一。这会导致冲突。尽量不要在多个文件中定义值。但如果有必要,请

#ifndef RATES_BALANCE_SCALER
#define RATES_BALANCE_SCALER 1000000
#endif

因此,如果已定义该值,则不会重新定义该值。

编辑:如果首先定义第三方宏,这将导致值不更改!如果您需要该值,请将其命名为不同的

答案 1 :(得分:0)

仅定义与两个不同的相同的东西应该是编程错误。这就是编译器在以不同方式重新定义错误时发出错误的原因。编译器支持#undef并重新定义,但对于重新定义宏替换可能意味着什么并未达成共识。

好的编译器在将宏重新定义为不同的东西时会发出错误,并且在执行多次时会发出警告(对于相同的字符串)但是,因为有很多遗留代码只是在几个中重新定义了相同的常量确保你最终获得定义的地方,通常编译器会对它保持沉默。