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

Gra*_*eme 12 c++

是否有任何关于使用数字限制宏(例如INT64_MAX)而不是std :: numeric_limits的论据?根据我的理解,numeric_limits在标准中,但宏仅在C99中,因此非标准.

Dav*_*one 14

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

在C++ 11, ,std::numeric_limits<T>::min(),std::numeric_limits<T>::max()std::numeric_limits<T>::lowest()都宣称constexpr,这样他们就可以在大多数同上下文的是可用的INT_MIN和公司.我能想到的唯一例外是使用#字符串化标记的编译时字符串处理.

这意味着,numeric_limits可用于标签的情况下,模板参数,等等,你在通用的代码中使用它的好处(建议使用INT_MIN对比LONG_MINtemplate<typename T> get_min(T t);).

C++ 11还为James Kanze所讨论的问题提供了一个解决方案,通过添加std::numeric_limits<T>::lowest(),它给出了所有类型的最低有限值,而不是整数类型的最低值和浮点类型的最低正值.


Jam*_*nze 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().)


Nim*_*Nim 8

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

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

我想我的观点是numeric_limits模板更有用,max()而且min()......

  • 重要提示:由于C++ 11`std :: numeric_limits <T> :: max()`是`constexpr`,因此异常不再成立. (4认同)

Rus*_*lan 5

std::numeric_limits尽管在 C++11 中,常量constexpr可以在模板等中使用,但至少在一种情况下您必须<climits>使用/中的宏<cstdint>。它是预处理器。在 C++ 中,预处理器与 C 中一样受到限制,因此它不能使用普通变量,无论是 aconst还是constexprone。结构成员更不用说了,模板化结构更不用说了。因此您不能执行以下操作:

#include <cstddef>
#include <limits>

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

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

#include <cstdint>
#include <climits>

// Works fine
#if SIZE_MAX > UINT_MAX
// ...
#endif
Run Code Online (Sandbox Code Playgroud)