可视化 C++ 宏重定义的范围是什么

visual What is the scope of a c++ macro redefinition?

本文关键字:范围 范围是 是什么 定义 C++ 可视化      更新时间:2023-10-16

>我有一个 c++ 实现文件 (my.cpp),它间接包含一个头文件 (b.h),它定义了_MAX_DRIVE:

// b.h
#define _MAX_DRIVE  64

然后my.cpp包括stdlib.h,它也定义了_MAX_DRIVE

// stdlib.h
#define _MAX_DRIVE  3   /* max. length of drive component */

显然,这会产生宏重定义警告:

stdlib.h(185) : warning C4005: '_MAX_DRIVE' : macro redefinition

我的问题是:

  1. 这种重新定义影响了多少代码,它只是 my.cpp 的编译单元吗?
  2. 如果 my.cpp 是静态库的一部分,重新定义的值是否可以进入其他代码?
  3. 如果我什至从未在 my.cpp 中引用_MAX_DRIVE,那么告诉编译器忽略此宏重定义警告是否安全?
  1. 直到当前编译单元结束,或者直到下一个#undef
  2. 否;宏名称仅由预处理器看到,预处理器甚至在编译开始之前就完成了运行。
  3. 这听起来不是一个非常明智的想法。 最好避免使用两个具有相同名称的宏(尤其是一个以单个下划线开头,后跟大写字母的宏,因为它们是为实现保留的)。

这种重新定义影响了多少代码,它只是 my.cpp 的编译单元吗?

它会影响包括 b.h 和 stdlib.h 的所有文件,如果它从未被#undef -ed

如果 my.cpp 是静态库的一部分,重新定义的值是否可以进入其他代码?

不,预处理器符号仅在编译时存在。编译的模块与它无关。

如果我什至从未在 my.cpp 中引用_MAX_DRIVE,那么告诉编译器忽略此宏重定义警告是否安全?

是的,直到有一天你或任何代码用户使用它并忘记或不知道这种危险。