numeric_limits的max问题。

unique_man 2009-02-16 10:12:29
std::numeric_limits<short>::max()这样用是错的。
(std::numeric_limits<short>::max)()这样用是对的。

VC2005中的头文件中定义为
static _Ty (__CRTDECL max)() _THROW0()
{ // return maximum value
return (SHRT_MAX);
}
有人说是为了避免和windows定义的宏混淆,我加了类名来调用的,应该先找到类的max函数,而不是先找到全局的定义啊,根本就不会产生冲突才对。

不明白。
...全文
633 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
buaanavy 2011-10-30
  • 打赏
  • 举报
回复
怎样避免在使用numeric_limits<int>::max()时默认展开windows定义的max()呢?
VirGhost 2009-02-16
  • 打赏
  • 举报
回复
在windef.h中max()被定义成了宏,而不是函数,你写的numeric_limits<int>::max(),这里max()会先进行宏展开,展开时会发生错误,因为没有参数。
nineforever 2009-02-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 unique_man 的帖子:]
std::numeric_limits <short>::max()这样用是错的。
(std::numeric_limits <short>::max)()这样用是对的。

VC2005中的头文件中定义为
static _Ty (__CRTDECL max)() _THROW0()
{ // return maximum value
return (SHRT_MAX);
}
有人说是为了避免和windows定义的宏混淆,我加了类名来调用的,应该先找到类的max函数,而不是先找到全局的定义啊,根本就不会产生冲突才对。

不明白。
[/Quote]

宏是在语法分析之前展开的
unique_man 2009-02-16
  • 打赏
  • 举报
回复
D:\a.cpp(488) : warning C4003: “max”宏的实参不足
D:\a.cpp(488) : error C2589: “(”: “::”右边的非法标记
D:\a.cpp(488) : error C2059: 语法错误 : “::”
D:\a.cpp(489) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)

我的报这个错误。msdn上我看过了,可以numeric_limits<int>::max()这么用。

我想知道为什么我的不能这么用!
太乙 2009-02-16
  • 打赏
  • 举报
回复
请参考msdn~
太乙 2009-02-16
  • 打赏
  • 举报
回复
 cout << " 4 The maximum value for int is " <<
numeric_limits<int>::max() << endl;
这应该没错啊~
unique_man 2009-02-16
  • 打赏
  • 举报
回复
鄙人不才,能不能说明白点?
waizqfor 2009-02-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
因为max宏的优先级和函数根本2码事。
[/Quote]
恩 就是怎么回事
taodm 2009-02-16
  • 打赏
  • 举报
回复
因为max宏的优先级和函数根本2码事。
unique_man 2009-02-16
  • 打赏
  • 举报
回复
谢谢楼上所有同学,知道了,貌似是包含头文件的问题。
nineforever 2009-02-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 unique_man 的回复:]
难道Test::max()这个调用max也会展开吗?
[/Quote]

是的,原因参见7楼
unique_man 2009-02-16
  • 打赏
  • 举报
回复
同学们,不应该是这么回事吧。
class Test
{
public:
static short max()
{
return 1;
}
}

难道Test::max()这个调用max也会展开吗?明显要调用Test的max啊。

问题的例子虽然是模板,但是定义如下:
template<> class _CRTIMP2_PURE numeric_limits<short>
: public _Num_int_base
{ // limits for type short
是特化类,不存在第一次进行扫描的问题,但是为什么也没有调用它的max就不明白了。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧