gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:29:33 24 4
gpt4 key购买 nike

什么是意外宏替换?

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com