不幸的是,目前的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”),这将完全没用。
答案 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)