c ++宏重定义的范围是什么?

Mat*_*hew 1 c++ visual-c++

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

// b.h
#define _MAX_DRIVE  64
Run Code Online (Sandbox Code Playgroud)

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

// stdlib.h
#define _MAX_DRIVE  3   /* max. length of drive component */
Run Code Online (Sandbox Code Playgroud)

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

stdlib.h(185) : warning C4005: '_MAX_DRIVE' : macro redefinition
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 这个重新定义会影响多少代码,它只是my.cpp的编译单元吗?
  2. 如果my.cpp是静态库的一部分,重新​​定义的值是否会进入其他代码?
  3. 如果我从来没有在my.cpp中引用_MAX_DRIVE,那么告诉编译器忽略这个宏重定义警告是否安全?

Oli*_*rth 8

  1. 直到当前编译单元结束,或直到下一个#undef.
  2. 没有; 宏名称只能由预处理器看到,它在编译开始之前完成运行.
  3. 这听起来不是一个非常明智的想法.最好避免使用两个具有相同名称的宏(尤其是以单个下划线开头后跟大写字母的宏,因为它们是为实现保留的).