3

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

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

2 回答 2

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

这个重定义影响了多少代码,难道只是my.cpp的编译单元?

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

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

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

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

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

于 2012-06-19T22:39:40.470 回答