【问题标题】:c++ cross platform way to define 64bit unsigned integerc++跨平台方式定义64位无符号整数
【发布时间】:2012-02-14 14:04:57
【问题描述】:

现在我正在开发一个在代码的许多部分广泛使用 64 位无符号整数的项目。到目前为止,我们只使用 gcc 4.6 进行编译,但我们现在正在将一些代码移植到 windows。这些无符号整数必须是 64 位宽,这一点至关重要。有人建议我们可以使用 long long 但如果 long long 恰好大于 64 位,那就不好了,我们实际上希望保证它将是 64 位,并且编写类似 static_assert(sizeof(long long) == 8) 的东西似乎有点代码气味。

定义 uint64 之类的东西的最佳方法是什么,它将在 gcc 和 msvc 上编译,而无需在任何地方使用不同的代码语法?

【问题讨论】:

  • ifdef 和 typedef 一起可以解决问题吗?
  • @DavidFeurle,这可能就足够了,问这个问题的目的是了解这里的最佳实践。

标签: c++ visual-c++ gcc


【解决方案1】:

包含cstdint 并使用std::uint64_t 怎么样?

【讨论】:

  • 仅在 c++11 中。在此之前,大多数编译器都有一个内在功能来完成这项工作。
  • @kukyakya,我现在在 gcc 上做这件事,但我不知道 MSVC 上是否有静态断言,因为我在这方面开发经验很少。
【解决方案2】:

你可以使用提升:

typedef int#_t,用 # 替换宽度,指定一个有符号的 正好 # 位的整数类型;例如 int8_t 表示 8 位 有符号整数类型。类似地,typedef uint#_t 指定一个 正好 # 位的无符号整数类型。

见:http://www.boost.org/doc/libs/1_48_0/libs/integer/doc/html/boost_integer/cstdint.html

尤其是这个标题: http://www.boost.org/doc/libs/1_48_0/boost/cstdint.hpp

【讨论】:

  • 有趣的建议,因为我们经常使用 boost,如果 cstdint 不可用,这可能会起到这个作用。
【解决方案3】:

这就是我的工作:

#ifndef u64
#ifdef WIN32
typedef unsigned __int64   u64;
#else // !WIN32
typedef unsigned long long u64;
#endif
#endif

【讨论】:

    【解决方案4】:

    在 Windows 上,您可以使用 __int64unsigned __int64 或 typedef:UINT64INT64 等。

    this

    但是是的,如果涉及代码可移植性,请按照其他人的建议使用标准 typedef。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多