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

时间:2012-06-19 22:34:36

标签: c++ visual-c++

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

// 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,那么告诉编译器忽略此宏重定义警告是否安全?

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

  

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

它会影响包含b.h和stdlib.h的所有文件,如果它永远不会#undef - 编辑

  

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

不,预处理程序符号仅在编译时生效。编译模块与它无关。

  

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

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