Portable C ++ 03精确宽度类型

时间:2009-09-26 17:47:18

标签: c++ types portability fixed-width

背景


不幸的是,目前的C ++标准缺少stdint标题中定义的C99精确宽度类型。

我能找到的下一个最好的东西(就可移植性而言)是来自Boost库的cstdint.hpp Boost.Integer实现。

关注


那就是说,我遇到了一些问题:

Boost的实现会转储typedef中的所有boost namesapce(而不是像boost::stdint这样的内容)。这完全是丑陋的,因为现在你被迫只对你感兴趣的类型使用using - 指令(这是一项额外的维护工作),或者带来整个boost namespace进入全球范围(这违背了namespace s)。当然,我可以是冗长的,并且在任何地方输入boost::uint32_t,例如,但这也不是非常适合未来的²。

问题


我基本上是在寻求建议。什么是尽可能透明地利用这些尚未标准(不是在C ++'03中)的最佳方式?

对于那些使用此标题或自行编辑的人,您如何使用这些类型?盲目地将boost namespace合并到全局namespace中,使用“boost::”作为前缀,写下包裹Boost.Integer的{​​{1}}等的标题?< / p>

感谢任何建议。

最后,说了这么多(顺便说一下,这不是一个咆哮),我正在编写数学密集型代码,所以宽度保证对我来说很重要。

澄清


1 - 当我编写将这些类型作为参数的函数/ cstdint.hpp class时,全局范围是我唯一的选择。

2 - 当标准的下一次迭代将template包装到stdint.h时,我会遇到一堆前缀为“cstdint”的代码。那么,这将是一个额外的依赖(即“boost / cstdint.hpp”),这将完全没用。

2 个答案:

答案 0 :(得分:6)

您可以使用stdint.h,并为没有它的编译器提供一个(例如,对于MSVC - msinttypes)。或者写一下using所有Boost的typedef的cstdint(这是一次写入,所以我认为维护不会有问题)。

它也很容易生成。使用this little script,我明白了。您还可以添加定义以检查int64

#ifndef GEN_CSTDINT
#define GEN_CSTDINT

#include <boost/cstdint.hpp>

using boost::int16_t;
using boost::int32_t;
using boost::int64_t;
using boost::int8_t;
using boost::int_fast16_t;
using boost::int_fast32_t;
using boost::int_fast64_t;
using boost::int_fast8_t;
using boost::int_least16_t;
using boost::int_least32_t;
using boost::int_least64_t;
using boost::int_least8_t;
using boost::intmax_t;
using boost::uint16_t;
using boost::uint32_t;
using boost::uint64_t;
using boost::uint8_t;
using boost::uint_fast16_t;
using boost::uint_fast32_t;
using boost::uint_fast64_t;
using boost::uint_fast8_t;
using boost::uint_least16_t;
using boost::uint_least32_t;
using boost::uint_least64_t;
using boost::uint_least8_t;
using boost::uintmax_t;

#endif // GEN_CSTDINT

答案 1 :(得分:1)

您可以使用portable version of stdint