Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ INT_[MIN | MAX]极限宏与数值极限<;T>;_C++ - Fatal编程技术网

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++11
std::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