C++ INT_[MIN | MAX]极限宏与数值极限<;T>;
在C++ INT_[MIN | MAX]极限宏与数值极限<;T>;,c++,C++,在std::numeric_limits上使用数值限制宏(例如INT64_MAX)是否有任何参数?从我理解的代码数值限制>代码中,宏只在C99中,因此非标准。 < P>如果C++,使用数字限制> /COD>,结束.< /P> 编辑:好的,根据James的评论,不是“结束”-例外是模板和案例标签。但是,我看不出为最小值或最大值设置一个案例标签,或者为它们设置一个模板有什么用处,但我想我还没有看到所有的可能性 我想我的观点是,numeric\u limits模板比max()和min()更有用……在某
std::numeric_limits
上使用数值限制宏(例如INT64_MAX
)是否有任何参数?从我理解的代码<代码>数值限制>代码中,宏只在C99中,因此非标准。 < P>如果C++,使用<代码>数字限制> /COD>,结束.< /P>
编辑:好的,根据James的评论,不是“结束”-例外是模板和案例标签。但是,我看不出为最小值或最大值设置一个案例标签,或者为它们设置一个模板有什么用处,但我想我还没有看到所有的可能性
我想我的观点是,numeric\u limits
模板比max()
和min()
更有用……在某些上下文中(例如,case
标签、非类型模板参数),需要一个数值常量,而numeric\u limits
不支持这一点:numeric\u limits::max()
不是一个常数。在case
标签中,必须使用INT\u MAX
这很烦人,但我听说C++11会解决这个问题。肯定是C++0x之前的版本
INT_MIN
和INT_MAX
是积分常量表达式<代码>数值限制::min()和数值限制::max()
不是<代码> 是标准C++,除非你处理模板(在那里你不知道它是代码> int <代码>还是<代码>长< /COD>),所以没有理由去麻烦这个过于复杂的解决方案。(另外:如果您正在编写模板,请不要忘记numeric\u limits::min()
和numeric\u limits::min()
表示完全不同的属性;如果您想要尽可能小的值,则需要numeric\u limits::is\u integer?numeric\u limits::min():-numeric\u limits::max()
)其他答案大部分都有正确的信息,但似乎C++11需要更新
在C++11中,std::numeric_limits::min()
,std::numeric_limits::max()
,和std::numeric_limits::lower()
都声明为constexpr
,因此它们可以在与INT_min
和company>相同的大多数上下文中使用。我能想到的唯一例外是使用#
字符串化标记进行编译时字符串处理
这意味着numeric\u limits
可用于案例标签、模板参数等,您可以在通用代码中使用它(尝试使用INT\u MIN
而不是template get\u MIN(T T);
中的LONG\u MIN
)
C++11还为James Kanze谈到的问题提供了一个解决方案,通过添加
std::numeric_limits::lowest()
,它为所有类型提供了最低的有限值,而不是整数类型的最小值和浮点类型的最小正值。尽管在C++11中,std::numeric_limits
中的常量是constexpr
,因此可以在模板等中使用它们。,在至少一种情况下,您必须使用
/
中的宏。这是预处理器。在C++中,预处理器和C一样有限,因此不能使用正常变量,如<代码> const 或<代码> CONTXPRP</代码>。结构的成员更少,模板结构更少。因此,您不能执行以下操作:
#include <cstddef>
#include <limits>
// Won't work!
#if std::numeric_limits<std::size_t>::max() > std::numeric_limits<unsigned>::max()
// ...
#endif
#包括
#包括
//不行!
#如果std::numeric_limits::max()>std::numeric_limits::max()
// ...
#恩迪夫
相反,您应该求助于以下工作(并且更具可读性!)变体:
#包括
#包括
//很好
#如果最大尺寸>最大尺寸
// ...
#恩迪夫
在需要整型常量表达式的上下文中尝试。比如说实例化一个模板,或者在case标签中。或者对于较小的类型,作为数组维度(UCHAR_MAX+1
很常见)。@James,hmm。。好的,我将编辑模板和大小写标签,但不确定数组的尺寸…重要提示:由于C++11std::numeric\u limits::max()
是constepr
,因此,异常不再成立。我要补充的是,整型常量表达式参数只起作用,如果要使用模板中的值。@Xeo:那不是真的。初始化静态类时它也很重要。@MSalters?如果没有整型常量,则无法初始化整型静态类?可以,但需要在类外定义它。@Xeo作为模板参数、数组维度、大小写标签,以及我可能忘记的其他一些情况。一般来说,简单的规则是当您知道类型时使用简单的解决方案(INT\u MAX
),当您不知道类型时使用复杂的解决方案(numeric\u limits
)。
#include <cstdint>
#include <climits>
// Works fine
#if SIZE_MAX > UINT_MAX
// ...
#endif