//In C.cpp
#include "A.h"
#include "B.h"
..
..
..
int my_value = MY_MACRO;
n
my_value是3还是45?
答案 0 :(得分:5)
来自标准(草案)[cpp.replace] §2:
当前定义为类似对象宏的标识符(见下文)可能会被另一个#define重新定义 预处理指令规定第二个定义是一个类似于对象的宏定义和两个 替换列表是相同的,否则程序是不正确的。 [...]
重新定义宏时会发生什么?
当新定义不同时,您的程序就会格式不正确。编译器需要向您显示诊断消息(警告或错误)。标准不定义格式错误的程序的行为。编译器可以自由拒绝编译程序。
my_value是3还是45?
无论您的预处理器/编译器选择什么。或者编译器可以拒绝编译它。
从技术上讲,如果您首先取消定义宏,程序将变得格式良好。那么定义的值显然是新定义的。但是,我不建议这样做,因为根据多个翻译单元中包含标题的顺序,您可以轻松地破坏其他规则。
最有可能的是,两个宏应该是独立的实体,并且有不同的文件期望从一个标头定义,而不是另一个标头。正确的解决方案是通过重命名一个名称为每个唯一名称,并更改相关文件以使用新名称。确定哪些文件使用哪个定义可能是一个挑战。在您使用它时,您可能希望用constexpr
变量替换宏。
答案 1 :(得分:1)
我想
重新定义宏时会发生什么?
它为宏提供重新定义警告。
仍然
如果您避免警告并尝试运行程序
然后我们都知道在cpp中所有语句都是从顶部到底部顺序执行的,所以无论打印的最后一个宏定义是什么。
代码45中的my_value是3还是45?
将被视为宏定义。