C++跨平台系列:解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题
来源:互联网 发布:淘宝微信链接转换 编辑:程序博客网 时间:2024/04/30 19:18
多年以前,Microsoft 幹了一件比 #define N 3
還要蠢的蠢事,那就是在 <windows.h>
放入了 min
/max
這兩個宏命令(macros)。
#define max(a,b) (((a) > (b)) ? (a) : (b))
因此,我們沒辦法好好地使用 C++ Standard 的 min/max 這兩個 algorithms,也沒有辦法好好地使用numeric_limits<>
。前者 Microsoft 用了另外兩個宏命令,_MIN
與 _MAX
來補救,但考量到跨平台程式設計,這兩個 macros 有跟沒有一樣。
#define _MAX _cpp_max ——> const T& std::_cpp_max(const T&,const T&);
後者就真的很傷腦筋了,很多時候,numeric_limits<>
的使用是無法避免的[1],
[1]舉例來說,為了跨平台的需求,我們無法得知 size_t
的真正型別,故無法直接使用 C 的 UINT_MAX
來表現size_t
的最大可能值。最好的方法,當然還是使用 numeric_limits<size_t>::max()
。
但當直接或間接 #include
進 <windows.h>
的時候,VC6 就會出現 C4003 warning 然後後面的程式就爛掉了。
通常來說,碰到這種相容性問題,先找看看 Boost 怎麼作就對了。(因為 Boost 裡面充滿了各種各樣最先進的 C++ 技術,而先進的 C++ 技術通常都會碰到相容性問題,因此 Boost 裡面就會有比較合適的解法存在。)於是我在 boost/config/suffix.hpp
裡,發現了 BOOST_PREVENT_MACRO_SUBSTITUTION
這一個宏命令,被安插在可能被 VC6 搞爛的 min
/max
後面,括弧前面。其用法如下:
std::max BOOST_PREVENT_MACRO_SUBSTITUTION(value1, value2);// orstd::numeric_limits<Foo>::max BOOST_PREVENT_MACRO_SUBSTITUTION();
實際上,BOOST_PREVENT_MACRO_SUBSTITUTION
是空的,會被代換成沒有任何東西,其目的應該是為了騙過 preprocessor,使其認為 min
/max
不是 VC6 雞婆定義的那個 macro,而留給 compiler 來剖析之。
不過,照著這招做實驗後發現,沒有用。也許是 Boost 還有其他機制,讓這招成功,但總之我就是弄不出來,BOOST_PREVENT_MACRO_SUBSTITUTION
會先被 preprocessor 代換成沒有任何東西,然後原來的 min
/max
的問題就又出現了。
只好求助 Google,幸好讓我發現了這串討論:《problems with new boost lib》,裡面提到可以使用括弧,來避免 preprocessor 作怪。也就是說,程式改成這麼寫:
(std::max)(value1, value2);// or(std::numeric_limits<Foo>::max)();
把 min
/max
連同前面的 namespace 括弧刮起來,再接上呼叫用的 (),這樣就既是合法的 C++ 語法,又可以避免愚鈍的 preprocessor 被白爛 VC6 的 min
/max
宏命令騙去。
- C++跨平台系列:解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题
- 使用numeric_limits max min的编译问题
- std::min and std::max与windows.h定义的min和max宏相冲突.
- std::min,std::max 与 MFC冲突的解决
- numeric_limits::max()和windows.h冲突的解决方法
- numeric_limits::max()和windows.h冲突的解决方法
- 关于min、max的宏定义与std中的冲突问题
- VS2015--win32工程配置的一些想法之算法min/max与windows中的 min/max宏冲突
- 模板函数min/max与Visual C++中的 min/max宏冲突
- 模板函数min/max与Visual C++中的 min/max宏冲突
- 模板函数min/max与Visual C++中的 min/max宏冲突
- (转)模板函数min/max与Visual C++中的 min/max宏冲突
- 模板函数min/max与Visual C++中的 min/max宏冲突
- 标准库std::min/std::max与min/max宏冲突
- std::min&std::max与mfc冲突问题
- max min的小问题
- max(min)-device-width和max(min)-width的区别
- max(min)-device-width和max(min)-width的区别
- 为了“千古之美”留正定
- 我的生活像做梦
- 搞笑文章-越女剑
- 两款MongoDB的可视化管理工具
- 苹果研发可弯曲电池技术 未来iOS设备会更薄更美观
- C++跨平台系列:解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题
- 网易博客搬家到CSDN-少占鱼通知
- openstreetmap website 部署文档
- PHP底层的运行机制与原理
- Spring 3 MVC 接收客户端上传的文件
- 冰冷的电影 冰冷的心
- 3节点hadoop2.2.0集群安装
- Oracle模糊查询之(3.1从使用函数和sql语法角度来提高模糊查询效率 一)oracle模糊查询效率提高
- 第九周 练习输入数字,输出星期