重新定义宏时会发生什么?

时间:2016-10-24 10:13:01

标签: c++ c macros

//In C.cpp

#include "A.h"
#include "B.h"

..
..
..
int my_value = MY_MACRO;
n

my_value是3还是45?

2 个答案:

答案 0 :(得分:5)

来自标准(草案)[cpp.replace] §2

  

当前定义为类似对象宏的标识符(见下文)可能会被另一个#define重新定义   预处理指令规定第二个定义是一个类似于对象的宏定义和两个   替换列表是相同的,否则程序是不正确的。 [...]

  

重新定义宏时会发生什么?

当新定义不同时,您的程序就会格式不正确。编译器需要向您显示诊断消息(警告或错误)。标准不定义格式错误的程序的行为。编译器可以自由拒绝编译程序。

  

my_value是3还是45?

无论您的预处理器/编译器选择什么。或者编译器可以拒绝编译它。

从技术上讲,如果您首先取消定义宏,程序将变得格式良好。那么定义的值显然是新定义的。但是,我不建议这样做,因为根据多个翻译单元中包含标题的顺序,您可以轻松地破坏其他规则。

最有可能的是,两个宏应该是独立的实体,并且有不同的文件期望从一个标头定义,而不是另一个标头。正确的解决方案是通过重命名一个名称为每个唯一名称,并更改相关文件以使用新名称。确定哪些文件使用哪个定义可能是一个挑战。在您使用它时,您可能希望用constexpr变量替换宏。

答案 1 :(得分:1)

我想

  

重新定义宏时会发生什么?

它为宏提供重新定义警告。

仍然

  

如果您避免警告并尝试运行程序

然后我们都知道在cpp中所有语句都是从顶部到底部顺序执行的,所以无论打印的最后一个宏定义是什么。

  

my_value是3还是45?

代码45中的

将被视为宏定义。