c++ 宏重定义的范围是啥?

Posted

技术标签:

【中文标题】c++ 宏重定义的范围是啥?【英文标题】:What is the scope of a c++ macro redefinition?c++ 宏重定义的范围是什么? 【发布时间】:2012-06-19 22:34:35 【问题描述】:

我有一个 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

我的问题是:

    这个重新定义影响了多少代码,它只是my.cpp的编译单元吗? 如果 my.cpp 是静态库的一部分,重新​​定义的值能否进入其他代码? 如果我什至从未在 my.cpp 中引用 _MAX_DRIVE,是否可以安全地告诉编译器忽略此宏重定义警告?

【问题讨论】:

以下划线开头后跟大写字母的标识符(例如_MAX_DRIVE)由编译器保留。不要在你自己的头文件中使用它们! 谢谢@Adam,很高兴知道。我正在处理不会更改的遗留代码,所以我只需要处理它。 【参考方案1】:
    直到当前编译单元结束,或者直到下一个#undef。 不;宏名称只有预处理器才能看到,它在编译开始之前就完成了运行。 这听起来不是一个非常明智的想法。最好避免使用两个同名的宏(尤其是一个以单个下划线后跟一个大写字母开头的宏,因为它们是为实现而保留的)。

【讨论】:

【参考方案2】:

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

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

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

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

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

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

【讨论】:

以上是关于c++ 宏重定义的范围是啥?的主要内容,如果未能解决你的问题,请参考以下文章

BOOST_ASIO_ERROR_CATEGORY_NOEXCEPT 宏重定义

请问C++ 中定义范围最大的 是啥 ???

C++ 中命名空间别名的范围是啥?

SAS宏重命名变量

C++重载重写重定义

C++中的重载,重写, 重定义 差别