在std :: numeric_limits上使用数字限制宏(例如INT64_MAX)是否存在任何争议?根据我的理解,numeric_limits在标准中,但宏仅在C99中,因此非标准。
答案 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_limits
与INT_MIN
在LONG_MIN
)。
C ++ 11还为James Kanze所讨论的问题提供了一个解决方案,通过添加template<typename T> get_min(T t);
,它给出了所有类型的最低有限值,而不是整数类型的最低值和最低的正值对于浮点类型。
答案 1 :(得分:10)
绝对是预C ++ 0x。 INT_MIN
和INT_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