【问题标题】:Why might using a "long long" in C or C++ be a bad thing?为什么在 C 或 C++ 中使用“long long”可能是一件坏事?
【发布时间】:2009-10-31 11:38:51
【问题描述】:

为什么在 C 或 C++ 中使用“long long”可能是一件坏事?

前几天我正在编译一个运行时库,并在代码中检查 long 是否为 64 位,如果不是,则使用 long long。但与此同时,它会发出 #warning “使用 long long”。我想不出任何理由将“long long”作为警告,除非它是开发人员留下的调试垃圾。

谢谢 陈兹

【问题讨论】:

    标签: c++ c gcc


    【解决方案1】:

    据我所知,long long 目前仅在 C99 中是标准的。它也是 C++0x 中的一种类型,但大多数现代编译器应该已经支持它。

    但是,对于固定大小的整数,可以使用 C99 标头 <stdint.h>,或在 C++ 中使用 <boost/cstdint.hpp>

    【讨论】:

      【解决方案2】:

      两个原因:

      你不知道 long long 有多长(哈哈!),所以如果代码假定它正好是 64 位,那么可能会有问题。

      如果你使用旧的 C 编译器,它可能不支持 long long。

      【讨论】:

      • 我并没有真正看到你的第一点,因为这对于任何其他通用整数类型都没有什么不同; C99 提供精确宽度和特定于域的整数类型是有原因的......
      • 记录一下:精确宽度的整数在 C99 中是可选的
      • @Christoph:是的。另一方面,我不知道 long 大于 64 位的任何实现,并且很可能 likelier long 正好是 64 位,如果它不短的话,比那个 long很长。
      • @sellibitze:根据 C99 7.18.1.1,§3 类型的精确宽度必须提供 8、16、32 和 64,如果这些类型在相关架构上可用;如果不是,long long 也不能是 64 位的,整点没有实际意义
      • "...如果此类类型可用..." --> 符合要求的实现不必具有这些类型 --> 可选
      【解决方案3】:

      我同意 Thomas Padron-McCarth 的观点。最好分别检查是否存在 int64_t(有符号)或 uint64_t(无符号),如果存在则使用它们。这与导致 size_t 的理智相同。

      【讨论】:

        【解决方案4】:

        它不是便携式的。具体来说,windows 编译器不支持 long long,你必须使用 __int64 和 unsigned __int64 代替(但在非 windows 平台上不一定使用)。

        这是不久前的事了,所以也许现在总是有 uint64_t 和 int64_t 可用的机会更大。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-07
          • 1970-01-01
          • 1970-01-01
          • 2011-11-08
          • 1970-01-01
          • 2010-11-30
          • 1970-01-01
          相关资源
          最近更新 更多