INT_ [MIN | MAX]限制宏与numeric_limits <t> </t>

时间:2011-04-07 10:29:28

标签: c++

在std :: numeric_limits上使用数字限制宏(例如INT64_MAX)是否存在任何争议?根据我的理解,numeric_limits在标准中,但宏仅在C99中,因此非标准。

5 个答案:

答案 0 :(得分:14)

其他答案大多都有正确的信息,但似乎这需要更新C ++ 11。

在C ++ 11中,std::numeric_limits<T>::min()std::numeric_limits<T>::max()std::numeric_limits<T>::lowest()都声明为constexpr,因此它们可以在与{{大多数相同的上下文中使用1}}和公司。我能想到的唯一例外是使用INT_MIN字符串标记的编译时字符串处理。

这意味着#可用于案例标签,模板参数等,您可以在通用代码中使用它(尝试使用numeric_limitsINT_MINLONG_MIN)。

C ++ 11还为James Kanze所讨论的问题提供了一个解决方案,通过添加template<typename T> get_min(T t);,它给出了所有类型的最低有限值,而不是整数类型的最低值和最低的正值对于浮点类型。

答案 1 :(得分:10)

绝对是预C ++ 0x。 INT_MININT_MAX是整数常量表达式; numeric_limits<int>::min()numeric_limits<int>::max()不是。 <climits>是标准的C ++,除非你处理模板(你不知道它是int还是long),否则真的没有理由去处理过于复杂的解决方案。 (另外:如果您正在编写模板,请不要忘记numeric_limits<int>::min()numeric_limits<double>::min()代表完全不同的属性;如果您想要最小可能值,则需要numeric_limits<T>::is_integer ? numeric_limits<T>::min() : -numeric_limits<T>::max()。)

答案 2 :(得分:8)

如果是C ++,请使用numeric_limits,结束。

编辑:好的,根据詹姆斯的评论,而不是“结束。” - 例外是模板和案例标签。但是,我看不出有用于最小或最大的案例标签或者模板的用途,但我想我没有看到所有可能性......

我想我的观点是,numeric_limits模板在max()min()之后更有用...

答案 3 :(得分:1)

在某些情况下(例如case标签,非类型模板参数),数字常量是预期的,numeric_limits不支持此:numeric_limits<int>::max()不是常量。在case标签中,您必须改为使用INT_MAX

这很烦人,但我听说C ++ 11会解决这个问题。

答案 4 :(得分:0)

尽管在C ++ 11中,std::numeric_limits中的常量为constexpr,以便您可以在模板等中使用它们,但是在必须的情况下,至少还有一种情况请改用<climits> / <cstdint>中的宏。它是预处理器。在C ++中,预处理程序受到的限制与在C语言中一样,因此它不能使用常规变量,无论是const还是constexpr。结构的成员少得多,模板化的结构也少得多。因此,您不能执行以下操作:

#include <cstddef>
#include <limits>

// Won't work!
#if std::numeric_limits<std::size_t>::max() > std::numeric_limits<unsigned>::max()
// ...
#endif

相反,您应该求助于以下可行的(并且更具可读性!)变体:

#include <cstdint>
#include <climits>

// Works fine
#if SIZE_MAX > UINT_MAX
// ...
#endif