C++中避免宏展开的括号用法的规范定义位置及名称问询
避免函数式宏展开的括号技巧及标准依据
方法名称
这个技巧没有广泛流传的专属名称,通常被称为括号包裹标识符规避宏展开,核心是利用预处理阶段的宏匹配规则差异来绕过函数式宏的替换。
原理与标准依据
函数式宏(比如Windows.h中的max)的匹配规则在C++14标准的16.3 宏替换章节(具体为16.3.1节“函数式宏的调用”)中有明确规定:
函数式宏的调用要求标识符后直接紧跟左括号
(,且两者之间不能有空白字符。
当你把成员函数名用括号包裹成(std::numeric_limits<double>::max)时,预处理阶段会将其识别为一个表达式,而非函数式宏调用的起始标识符,因此不会触发max宏的展开。
代码对比示例
原代码(会触发宏展开)
#include <limits> #include <Windows.h> int main() { std::numeric_limits<double>::max(); }
修改后代码(规避宏展开)
#include <limits> #include <Windows.h> int main() { (std::numeric_limits<double>::max)(); }
内容的提问来源于stack exchange,提问作者Thomas W.
相关产品推荐
相关产品推荐

