http://www.cnblogs.com/cvbnm/articles/1947743.html

多年以前,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]

[]舉例來說,為了跨平台的需求,我們無法得知 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);
// or
std::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 宏冲突问题的更多相关文章

  1. 2.10 用最少次数寻找数组中的最大值和最小值[find min max of array]

    [本文链接] http://www.cnblogs.com/hellogiser/p/find-min-max-of-array.html [题目] 对于一个由N个整数组成的数组,需要比较多少次才能把 ...

  2. 产生10个随机数5-9之间 统计一个int类型的一维数组中有多少个在[min,max]之间的数

    * 产生10个随机数5-9之间 统计一个int类型的一维数组中有多少个在[min,max]之间的数 */ import java.util.*; public class Demo{ public s ...

  3. 无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_90_CI_AI" 之间的排序规则冲突。的解决方法

    在SQL SERVICE的查询的时候遇到了“无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_90_CI_AI&q ...

  4. 在一定[min,max]区间,生成n个不重复的随机数的封装函数

    引:生成一个[min,max]区间的一个随机数,随机数生成相关问题参考→链接 var ran=parseInt(Math.random()*(max-min+1)+min); //生成一个[min,m ...

  5. LINQ to SQL Count/Sum/Min/Max/Avg Join

    public class Linq { MXSICEDataContext Db = new MXSICEDataContext(); // LINQ to SQL // Count/Sum/Min/ ...

  6. LINQ Count/Sum/Min/Max/Avg

    参考:http://www.cnblogs.com/peida/archive/2008/08/11/1263384.html Count/Sum/Min/Max/Avg用于统计数据,比如统计一些数据 ...

  7. LINQ to SQL 语句(3) 之 Count/Sum/Min/Max/Avg

    LINQ  to SQL 语句(3) 之  Count/Sum/Min/Max/Avg [1] Count/Sum 讲解 [2] Min 讲解 [3] Max 讲解 [4] Average 和 Agg ...

  8. 无法解决 equal to 运算中 "Chinese_PRC_BIN" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突

    无法解决 equal to 运算中 "Chinese_PRC_BIN" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突.问题如下图: 执行一下语 ...

  9. [转]LINQ语句之Select/Distinct和Count/Sum/Min/Max/Avg

    在讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ ...

随机推荐

  1. new NABCD

    小组名称: 天天向上 项目名称:连连看 小组成员:王森(组长).胡丽娜.林莉.张政.张金生 新NABCD模型 N(需求) 传统的连连看有许多,玩法单一,感觉没意思,用户更希望连连看游戏增加更多的与众不 ...

  2. Java类型相互转换byte[]类型,blob类型

    在我们的程序开发当中,经常会用到java.sql.Blob.byte[].InputStream之间的相互转换,但在JDK的API当中,又没有直接给我们提供可用的API,下面的程序片段主要就是实现它们 ...

  3. HDU 1257 最少拦截系统(Dilworth定理+LIS)

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. The resource could not be loaded because the App Transport Security policy requires the use of a secure connection

    xmpp 项目中遇到的问题,用苹果的通信API 写一个PUT 方法,向服务器上传一张图片.遇到如题问题. Plist 文件没有NSAppTransportSecurity属性 Dic,添加该属性,再添 ...

  5. Android消息处理机制

    Android消息处理机制 Android应用程序消息处理机制(深入到native,实际由管道实现-pipe&epoll)

  6. [ZZ] Adventures with Gamma-Correct Rendering

    http://renderwonk.com/blog/index.php/archive/adventures-with-gamma-correct-rendering/ Adventures wit ...

  7. 34. 求e的近似值

    求e的近似值 #include <stdio.h> double fact (int n); int main() { int i, n; double item, sum; while ...

  8. html 实体转换为字符:转换 UEditor 编辑器 ( 在 ThinkPHP 3.2.2 中 ) 保存的数据

    在 ThinkPHP 3.2.2 中使用 UEditor 编辑器保存文章内容时,数据库中保存的数据都被转义成实体,例如:&lt;p&gt;&lt;strong&gt;& ...

  9. MuPlayer『百度音乐播放内核』

    MuPlayer『百度音乐播放内核』 —— 跨平台.轻量级的音频播放解决方案. 多端(PC & WebApp)通用,统一的API调用方式 HTML5 Audio与Flash内核的平滑切换(支持 ...

  10. x5设置经典门户登录

    runtime\UIServer\index.jsp   java.lang.String url = request.getContextPath() + "/portal2/proces ...