什么是偶然的宏观替代?

Vic*_*sky 7 c++ coding-style

什么是偶然的宏观替代?

Vera ++ C++ linter中,规则T016指出:

应该保护对min和max函数的调用以防止意外的宏替换.

x = max(y, z); // wrong, vulnerable to accidental macro substitution

x = (max)(y, z); // OK

x = max BOOST_PREVENT_MACRO_SUBSTITUTION (y, z); // OK
Run Code Online (Sandbox Code Playgroud)

为什么这是一个很好的规则,以及需要此规则的最小和最大函数有什么特别之处?

use*_*342 8

意外宏替换是无意中使用名称与函数冲突的宏.

情况维拉++的检查被设计为防止发生时行为不端系统头-最著名<windows.h>-定义minmax具有相同名称的应用程序定义的功能或甚至与标准库函数,如干扰宏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不定义minmax宏.