c++ - 什么是意外宏替换?

标签 c++ coding-style

什么是意外宏替换?

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> — 定义 minmax干扰应用程序定义的同名函数或什至干扰标准库函数的宏,例如 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不定义 minmax宏。

关于c++ - 什么是意外宏替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15451351/

相关文章:

c++ - 当且仅当文本框具有焦点并且按下 "enter"时才实现槽函数?

c++ - 声明和访问在构造函数 c++ 中启动的二维 vector

c++ - 为什么 ".exe"从相同的 c/c++ 源代码编译时比 ".out"大得多?

C++ 引用/指针

coding-style - 一种更pythonic的方式来表达有条件的有界循环?

Javascript InfoVis Spacetree 单个节点样式

c++ - C++ 中的未知类型错误

matlab - 将时间中值滤波器应用于视频

xml - 是否有 XML 元素的标准命名约定?

c# - .NET 中的编码风格 : whether to refactor into new method or not?