多年以前,Microsoft 幹了一件比 #define N 3 還要蠢的蠢事,那就是在 放入了 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::max()。

但當直接或間接 #include 進 的時候,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::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::max)();

把 min/max 連同前面的 namespace 括弧刮起來,再接上呼叫用的 (),這樣就既是合法的 C++ 語法,又可以避免愚鈍的 preprocessor 被白爛 VC6 的 min/max 宏命令騙去。

max std value 宏_【转载】:【C++跨平台系列】解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题...相关推荐

  1. max std value 宏_新药临床试验统计分析中计量资料的SAS宏实现

    sunruihua@263.net 通讯地址: 100029 北京市朝阳区樱花东路 2 号中日友好医院科研处 在新药临床试验中, 研究的变量主要分为定量资料. 定性资料和半定量资料也就是平时常说的等级 ...

  2. max std value 宏_Rust Macro/宏 新手指南

    Rust语言最强大的一个特点就是可以创建和利用宏/Macro.不过创建 Rust宏看起来挺复杂,常常令刚接触Rust的开发者心生畏惧.这片文章 的目的就是帮助你理解Rust Macro的基本运作原理, ...

  3. std::max,std::min错误:应输入标识符的解决方法

    使用VS2010编写的C++程序 std:min 转换到 VS2013无法识别,显示"错误:应输入标识符".     标准库在头中定义了两个模板函数std::min() 和 std ...

  4. (转载) min()的宏定义中的(void) (_x == _y)的含义

    Original Address:http://www.crifan.com/2010/08/13/order_min__macro_definition_void_amp__x__amp__y_th ...

  5. 一步一步学Silverlight 2系列(32):图形图像综合实例—“功夫之王”剧照播放_转载...

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  6. c++ max 的头文件_学用C/C++编写小游戏程序(2.2 打字练习游戏)

    2.2 打字练习游戏(随机数与特殊输入) 有了上面的绘制简单动画的技术,现在来看一下简易的打字练习游戏. [程序2-2]编写一个简易的打字训练游戏:计算机每次随机生成一个小写英文字符,从屏幕一行的左侧 ...

  7. ant指定servlet版本_[转载]程序开发常见错误

    [转载]程序开发常见错误 (2011-06-19 14:28:13) 标签: 转载 谢谢 项目中遇到的错误 sql错误 找不到列 Unknown column 'fillMen' in 'field ...

  8. tmap的使用_(转载)UE4容器TArray、TMap的使用

    ue中特有容器的使用 1.Log日志宏 输出到屏幕上的调试日志会覆盖,在output log窗口则可以全部显示,所以先写个打日志的宏 DECLARE_LOG_CATEGORY_EXTERN(MyCon ...

  9. 快速提高英语口语和听力水平的办法_转载

    快速提高英语口语和听力水平的办法_转载 掌握技巧 学好口语 有没有机会在美国生存.发展下去,关键是要看有没有机会去表达自己,和别人交流.如果你学的是哑巴英语,到了美国你将十分困 难.而目前我们的大学英 ...

最新文章

  1. Spring Web MVC(一)
  2. Asp.net Core Configuration
  3. hive SERDEPROPERTIES 中对NULL的处理
  4. DL之InceptionV2/V3:InceptionV2 InceptionV3算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  5. 设计模式理解:模板方法
  6. python分布式框架有哪些_Python并行分布式框架Celery详解
  7. [转载] Java中自定义异常的声明与处理
  8. mysql 命令 例子_Mysql 命令实例
  9. WinXP IIS配置
  10. 为什么少有人在Windows电脑上安OS X?
  11. AdaBoost中利用Haar特征进行人脸识别算法分析与总结2——级联分类器与检测过程
  12. 十款经典游戏的Java版本(开源)
  13. x7 z8750 linux,x7-z8750 vs m3-7y30
  14. sketchup 计算机配置,草图大师2020对电脑配置要求
  15. java的class文件在哪里_传统上,你在哪里存储Java .class文件?
  16. USB3.0 HUB方案之GL3520
  17. win10访问不了win7文件服务器,win7系统无法访问win10系统的共享文件的解决方法
  18. C语言之父丹尼斯·里奇:乔布斯脚下的巨人肩膀
  19. cos和sin转换公式
  20. 数据湖(十一):Iceberg表数据组织与查询

热门文章

  1. 写给MongoDB开发者的50条建议Tip14
  2. matlab的combuilder系列-matlab下做com组件 zzfrom SMTH bbs
  3. 网页上的播放器相关参数说明
  4. oracle密文怎么弄成明文,明文编码随机化加密方案
  5. java中service设计_JDBC中DAO+service设计思想
  6. python迷宫小游戏代码_课内资源 - 基于python实现的迷宫游戏
  7. db2 删除索引_程序员必须了解的知识点——你搞懂mysql索引机制了吗?
  8. 学校年检计算机台账,学校年检整改报告.docx
  9. php 复杂数组排序,如何利用php array_multisort函数 对数据库结果进行复杂排序
  10. 剑指offer面试题[26]-复杂链表的复制