什么是意外宏替换?
在Vera++ C++ linter,规则 T016 状态:
The calls to min and max functions should be protected against accidental macro substitution.
x = max(y, z); // wrong, vulnerable to accidental macro substitution x = (max)(y, z); // OK x = max BOOST_PREVENT_MACRO_SUBSTITUTION (y, z); // OK
为什么这是一条好规则,需要这条规则的 min 和 max 函数有什么特别之处?
最佳答案
意外宏替换是指无意中使用了名称与函数冲突的宏。
Vera++ 的检查旨在防止在系统 header 行为不当时发生这种情况——最著名的是 <windows.h>
— 定义 min
和 max
干扰应用程序定义的同名函数或什至干扰标准库函数的宏,例如 std::min<T>
, std::max<T>
, 和 std::numeric_limits<T>::min()
. (已知其他名称也会引起冲突。)
由于宏不是命名空间感知的,因此调用函数为 std
::min(...)
没有帮助,因为 min
仍然由预处理器扩展。要解决此问题,必须将此类函数调用为 (function)(args...)
, 如果它被定义为 #define function(arg1, arg2) ...
将防止宏展开,就像 min
的典型情况一样和 max
.另一个可用选项是 #undef
它们在使用之前,但在包含行为不端的 header 之后。 Boost 提供了自己的替换预防标记,尽管它的 self 描述性被它引入的困惑所抵消。
如果您控制包含 <windows.h>
, 你也可以 #define NOMINMAX
在包含之前,它将指示 windows.h
不定义 min
和 max
宏。
关于c++ - 什么是意外宏替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15451351/