C++:Windows.h max宏与std::max冲突问题解决

本文介绍了在C++项目中,由于Windows.h头文件中的max宏与C++标准库的std::max冲突的问题,以及如何通过括号包裹std::max、使用namespace或定义NOMINMAX宏来解决这类冲突。
摘要由CSDN通过智能技术生成

C语言引入的宏支持了一定程度的元编程,但它仅仅是简单的字符串替换,这种“六亲不认”的操作很容易导致一些编译错误。

这篇文章介绍了一种场景:项目同时引入了老的C头文件,里面用宏定义了一些宏函数;还引入了C++的头文件,里面用其他方式定义了一些同名函数。具体到问题本身,这个老的头文件是Windows.h,它里面用宏定义了max函数,C++的标准库的algorithm也定义了max函数。

问题重现
简单的示例程序如下:

#include <Windows.h>
#include <algorithm>
 
int main()
{
    int m = std::max(5, 6);
}


编译时,会报错:


先看一下Windows.h中的max宏长啥样子。实际上max宏定义在minwindef.h头文件,而Windows.h引用了minwindef.h。max宏定义如下:

#ifndef NOMINMAX
 
#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif
 
#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif
 
#endif  /* NOMINMAX */


再来分析出错的原因,是程序里的max被认为是Windows.h中的宏,会进行替换,这样std::max(5, 6)会替换成:

std::(((5) > (6)) ? (5) : (6));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值