什么是偶然的宏观替代?
在Vera ++ C++ linter中,规则T016指出:
应该保护对min和max函数的调用以防止意外的宏替换.
Run Code Online (Sandbox Code Playgroud)x = max(y, z); // wrong, vulnerable to accidental macro substitution x = (max)(y, z); // OK x = max BOOST_PREVENT_MACRO_SUBSTITUTION (y, z); // OK
为什么这是一个很好的规则,以及需要此规则的最小和最大函数有什么特别之处?
意外宏替换是无意中使用名称与函数冲突的宏.
情况维拉++的检查被设计为防止发生时行为不端系统头-最著名<windows.h>-定义min和max具有相同名称的应用程序定义的功能或甚至与标准库函数,如干扰宏std::min<T>,std::max<T>和std::numeric_limits<T>::min().(众所周知,其他名字也会造成冲突.)
由于宏不支持名称空间,因此调用这些函数无济于事,因为预处理器仍在扩展.要解决此问题,必须调用此类函数,这将阻止宏扩展,前提是它被定义为,通常情况下是和.另一个可用的选项是在使用之前,但在包括行为不端的标题之后.Boost提供了自己的替代预防标记,尽管其自我描述性被其引入的混乱所抵消.std::min(...)min(function)(args...)#define function(arg1, arg2) ...minmax#undef
如果你控制包含<windows.h>,你也可以#define NOMINMAX在它包含之前,这将指示windows.h不定义min和max宏.