【问题标题】:Should I be using numeric_limits or C limit macros?我应该使用 numeric_limits 还是 C 限制宏?
【发布时间】:2014-01-05 14:02:40
【问题描述】:

我是 SO 新手,这是我的第一个问题,但我已阅读规则,希望不会违反任何规则。

我最近开始学习编程并选择 C++ 作为我的第一语言。今天,我已经到了需要帮助才能做出正确决定的地步。我正在从第 6 版 C++ Primer Plus 中学习,到目前为止作者只介绍了 C 宏,并且没有说过关于 numeric_limits 模板(至少我认为它是一个模板)关于哪个由于我的好奇心,我从网上学习。

所以,现在我有点迷茫了,因为如果我理解正确的话,numeric_limits 是一种检查 C++ 类型限制的现代方法,因为它易于扩展。此外,在 C 宏中的 AFAIK 中,没有像 char16_t 这样的 C++11 类型的定义。

虽然我只搜索了that question,但提供了尽可能有用的答案,但不幸的是,他们没有回答我特别感兴趣的问题。而且他们实际上大多都很老了。

现在,具体问题:

基于未来对代码执行速度、安全性和实用性的需求(我不太关心简单性)是使用那些旧的 C 宏还是我应该坚持 numeric_limits 考虑到我提到的各个方面?

请原谅我在英语中的任何错误。这不是我的母语。

【问题讨论】:

  • 你的英语很好。
  • 您链接的问题中接受的答案仍然是很好的建议。使用numeric_limits。如果您的编译器完全支持C++11,那么大多数numeric_limits 函数都是constexpr,这增加了它们的实用性。
  • @PeteBecker 非常感谢。我通过 MinGW 使用 g++ 4.8.1 作为我的编译器,AFAIK 主要支持 C++11,所以这应该不是问题。

标签: c++ c++11 numeric-limits


【解决方案1】:

虽然 DBL_MAX 和 std::numeric_limits::max() 都非常好(除了后者很烦人),但当您想更改具有 typedef 的值表示时,您可能不会使用前者:

struct X {
   typedef double Real; // may become float
};

另外,有模板你必须使用 std::numeric_limits。

【讨论】:

    【解决方案2】:

    对于大多数代码,C 的宏或 C++ 的 std::numeric_limits 都可以正常工作。在 C++03 中存在 min()max() 成员无法生成常量表达式的问题,但这个问题已通过 C++11 的 constexpr 解决。

    这两种方法都是完全类型安全的,如果你能衡量一个程序的两个版本之间的差异,我会感到惊讶,这两个版本的差异仅在于获取类型属性的方式。宏不可替代的主要领域是模板:您需要为模板实体指定一个固定名称,而宏不能那样工作(它们也在编译期间的错误时间展开)。

    就我个人而言,我总是使用std::numeric_limits<T>,主要是因为我可以在我的所有代码中使用它,而且我可以更好地记住名字。

    【讨论】:

    • 这正是我需要的答案。老实说,我认为std::numeric_limits 实际上更容易习惯,因为我不需要学习所有这些宏的名称。我只需要知道类型的名称,我已经很熟悉了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2011-08-08
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多