numeric_limits 是标准C++库的一部分, 类型安全的. 一致的方式获得各种数值类型的边界值.
在Essential C++中, 第一次看到这个. 碰巧看到的前一点使用了 climits中的 DBL_MAX 宏. 使用宏的问题在于它不是类型安全的, 另外, 有记忆负担, 比如, 查找到DBL 这个名字之前, 我尝试了 DOUBLE_MAX, 毕竟有 INT_MAX, 使用模板的优势之一是记忆负担减轻了. 只需要记住 numeric_limits, numeric不是numberic, limits带有s. 记住这个之后就简单了.
但实际使用中, 却发现原来的宏max, min会粗暴地横插一杠子进来, 让代码编译不过, 出现的错误信息也不知所云.
办法是关闭这个宏, 跟max一样粗暴的作法是:
#undef max
或文明一点
#ifdef max
#undef max
#endif
对于特定的编译器VC, 可以更好一点:
#pragma push_macro("max")
#undef max
printf("max double: %f\n", numeric_limits
::max() );
#pragma pop_macro("max")
但是, 老实说, 这样的办法可不好, 多打了多少字.
真正普及了模板之后, 完全可以用类型安全的模板方法, 这样就可以永远地在全局范围内把宏max, min给去掉了.
2009-06-03
在
看到了一个绝好的方法:
(numeric_limits::max)()
利用了预处理器的一个tricks, 函数式宏在接下来的第一个非空字符不是(时, 不会展开该宏. 这说明宏的处理也并非是纯粹的文字替换那么野蛮.
这个办法还可以用来解决一般性的函数式宏与真正的函数名之间的冲突.
阅读(1609) | 评论(0) | 转发(0) |