`
阿尔萨斯
  • 浏览: 4363866 次
社区版块
存档分类
最新评论

跨平台C++整数类型 之一 固定宽度整数(boost和C++11)

 
阅读更多

原来一直使用ACE的跨平台整数类型,比如:ACE_UINT32, 但是自己使用C++的风格是明显的现代风格,以范型为主,所以最近开始逐步替换ACE的代码,改用boost库。

在boost库中,standard integer types用来支持跨平台的整数类型,我用的是1.48版本,参考文档:

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

boost库的整数实现基于99 C标准,不选98C++标准为基础是因为有些情况下的未定义行为。将来新的C++标准如果规定了跨平台整数类型的话,boost的这个库可能被废除。不过现在C++11还没有编译器完全支持,也没有太多选择。

自己实现固然可以,不过意味着分发困难和很多测试,看明白boost如何实现的就可以了。没必要自己干这胀活吧。

注意,总是使用boost::开头的类型和模板,不要直接使用boost引入的C的标准类型和宏。

现在开始。

boost提供了精确宽度的整数类型,采用int#_t 命名,#就是位数,比如int8_t 代表有符号的8位整数。那么它的真实对应物是什么?

注意,我这里是Ubuntu 64bit, GCC4.6.3, boost 1.48.0

/* For GCC 2.7 and later, we can use specific type-size attributes.  */
# define __intN_t(N, MODE) \
  typedef int int##N##_t __attribute__ ((__mode__ (MODE)))
# define __u_intN_t(N, MODE) \
  typedef unsigned int u_int##N##_t __attribute__ ((__mode__ (MODE)))

# ifndef __int8_t_defined
#  define __int8_t_defined
__intN_t (8, __QI__);
__intN_t (16, __HI__);
__intN_t (32, __SI__);
__intN_t (64, __DI__);
# endif


用宏替换后,其实就是:

typedef int int8_t __attribute__ ((__mode__ (__QI__)))
用到了几个GCC编译器的指令

__attribute__, __mode和 __QI__


##是宏的连接符号。


这篇帖子解释了这些指令:http://stackoverflow.com/questions/4559025/what-does-gcc-attribute-modexx-actually-do

__QI__就代表最小寻址单元,一个字节,8位。

__HI__ 以及后面的指令都是8位的若干倍数。


至于无符号固定宽度整数类型,前面加上u,形如:uint#_t 就是无符号整数的固定宽度表达方法。

实现采用了另一套typedef,没有用上面的编译器指令

/* Unsigned.  */
typedef unsigned char		uint8_t;
typedef unsigned short int	uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int		uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int	uint64_t;
#else
__extension__
typedef unsigned long long int	uint64_t;
#endif

更新:2013/9/14

不过今天开始启用C++11,现在有了标准的可用。参考文档:

http://en.cppreference.com/w/cpp/types/integer

几乎和boost里面的一样。所以本文标题也有所改变。





分享到:
评论

相关推荐

    The Boost C++ Libraries_boost库_birthcng_Boostc++_Boost_

    Boost库中的birthcng部分可能指的是“Bounded Integer Template”(有限整数模板),这是一个提供固定大小整数类型和相关操作的库,它在需要精确控制整数大小和溢出行为的场合特别有用,比如在嵌入式系统或低级编程...

    C++元编程和Boost编程库

    Boost库是C++标准库以外的一个广泛使用的、跨平台的、开源的编程库集合,它包含了一系列以Boost命名的C++库。这些库覆盖了各个领域,包括字符串处理、泛型编程、并发编程等。在元编程方面,Boost库提供了元编程库...

    C++BOOST中文帮助文档.zip

    Boost库是C++编程领域中的一个关键资源,它旨在增强C++的标准库,提供一系列高效、高质量、跨平台的库组件。这些库组件涵盖了多种编程需求,包括算法、数据结构、并发、错误处理、数学计算、序列化以及泛型编程等。...

    c++ boost asn1实现

    在IT行业中,ASN.1(Abstract Syntax Notation One)是一种标准化的数据表示语言,常用于通信协议、数据存储和软件工程中的复杂数据结构...在处理通信协议或需要跨平台数据交换的项目中,它是C++程序员的一个强大工具。

    boost_1_77_0 静态库

    3. **Boost.Filesystem**:处理文件和目录操作,如创建、删除、重命名、遍历目录等,是跨平台的文件操作库。 4. **Boost.Asio**:异步I/O库,支持网络编程、定时器、信号处理等功能,广泛应用于开发并发网络服务。 ...

    boost帮助文档

    Boost库是C++编程语言中的一个开源库集合,它提供了大量的高效、跨平台的库,旨在提升C++的标准库功能,特别是在模板元编程、泛型编程、算法、容器、智能指针、线程管理、图形界面、数学计算等多个领域。Boost库在...

    C/C++ 大小端判断

    通过理解大小端的概念以及在C/C++中如何进行判断和转换,开发者可以更好地处理跨平台和网络编程中的问题。在面试中,能够流畅地讲解和展示这些知识不仅能体现技术功底,也能增加求职成功的几率。

    Boost.org细节模块.zip

    3. **Boost.Filesystem**:提供跨平台的文件系统操作,如路径处理、文件和目录的创建、删除等,简化了与操作系统文件系统的交互。 4. **Boost.DateTime**:用于日期和时间处理,包括时间点、时间间隔、日期、时间等...

    dlib-18.1 各种数据处理 学习的c++源代码

    Dlib是一个使用现代C++技术编写的跨平台的通用库,遵守Boost Software licence. 主要特点如下: 1.完善的文档:每个类每个函数都有详细的文档,并且提供了大量的示例代码,如果你发现文档描述不清晰或者没有文档,...

    Boost.orgcircular_buffer模块.zip

    Boost库是C++标准库的一个扩展,由C++社区成员开发并维护,包含了大量的高质量、跨平台的C++库,旨在提高开发效率和代码质量。circular_buffer是Boost库中的一个数据结构,它是一个动态数组,其特点是可以在两端进行...

    c++ 日期结构 编程 SDK

    5. **跨平台编程**:当涉及到跨平台的日期和时间处理时,C++标准库和第三方库(如Boost.Date_Time)通常比SDK更可靠,因为它们能在不同操作系统上保持一致的行为。 6. **异常处理**:在处理日期和时间时,要注意...

    c++的概要介绍与分析

    C++是一种静态类型的、编译式的、通用的、大小写敏感的程序设计语言,它不仅支持过程化编程、数据抽象、面向对象编程(OOP)、泛型编程等多种编程范式,还拥有丰富的标准库和第三方库支持。C++的语法兼容C语言,但在...

    Boost.orgrandommodule.zip

    5. **跨平台兼容性**:Boost.Random库设计时考虑了跨平台兼容性,可以在不同的操作系统和编译器上无缝工作。 在实际应用中,"Boost.org random module"可以帮助开发者轻松创建随机试验、进行模拟研究或者构建需要...

    N1遥感文件解析操作类

    6. **跨平台支持**:由于C++的标准库并不提供所有必要的文件系统和I/O功能,可能需要使用第三方库如Boost或者标准库的`<filesystem>`来实现跨平台的文件操作。同时,处理字节顺序时,需要考虑大小端问题,可以使用`...

    boost-program-option-training

    总的来说,`boost::program_options`库使得在C++程序中处理命令行参数变得简单且灵活,而CMake则作为一个强大的构建系统,可以帮助管理和构建跨平台的项目。这个"boost-program-option-training"项目为学习和实践...

    c++使用stl进行系列化和反系列化.docx

    在C++编程中,序列化和反序列化是常见的需求,它们...不过,这种方法可能不适合那些需要保存类型信息或跨平台兼容性的复杂场景,这时可能需要更专门的序列化库,如Boost.Serialization或Google Protocol Buffers等。

    inttypes.h+stdint.h压缩包

    5. `int_least8_t`, `uint_least8_t`, `int_least16_t`, `uint_least16_t`, `int_least32_t`, `uint_least32_t`, `int_least64_t`, `uint_least64_t`: 定义了至少相应位数的最小宽度整数类型。 6. `int_fast8_t`, `...

    BoostC++库的最小子集.zip

    3. **Boost.Filesystem**:提供了对操作系统文件系统接口的跨平台封装,如文件和目录的操作,路径解析等。 4. **Boost.Signals2**:信号与槽机制,允许对象间进行通信和事件驱动编程,类似于Qt的信号和槽。 5. **...

    eigen3.4.0库

    Eigen3.4.0库是C++中一个广泛使用的开源线性代数库,它提供了...其高效的性能和易用性使其成为C++开发者的首选线性代数工具之一。通过深入了解和熟练掌握Eigen3,开发者能够更好地解决各种涉及矩阵和向量运算的问题。

Global site tag (gtag.js) - Google Analytics