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

标签 c++ c macros

#define MY_MACRO 3 --> in A.h
#define MY_MACRO 45 --> B.h

//In C.cpp

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

..
..
..
int my_value = MY_MACRO;

my_value 是 3 还是 45?

最佳答案

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

An identifier currently defined as an object-like macro (see below) may be redefined by another #define preprocessing directive provided that the second definition is an object-like macro definition and the two replacement lists are identical, otherwise the program is ill-formed. [...]


What happens when you redefine a macro?

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

What will my_value be 3 or 45?

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


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

最有可能的是,这两个宏应该是独立的实体,并且有不同的文件需要来自一个 header 的定义,而不是另一个。正确的解决方案是通过重命名为每个文件赋予一个唯一 名称,并将相关文件更改为使用新名称。弄清楚哪些文件使用哪个定义可能是一个挑战。当您使用它时,您可能想用 constexpr 变量替换宏。

关于c++ - 重新定义宏时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40215815/

相关文章:

c++ - 在 C++ 程序中找不到环境变量 UID

c++ - 静态分配继承对象的数组

c++ - Matlab 的 imtransform 的 C/C++ 等效项?

c - 如何编写带有可选参数和可变参数的宏

c - 在编译时从 __VA_ARGS__ 确定参数类型

C++如何压缩花哨的for循环

c++ - 数组编译时生成?

c - 在 C 中使用旧式函数定义在 MinGW 编译器中给出错误

c - pthread 中的读/写锁

c - Gcc 4.8.2 默认编译和运行可变长度数组