boost跨平台 c++_跨平台C++整数类型 之一 固定宽度整数(boost和C++11)
原來一直使用ACE的跨平臺(tái)整數(shù)類型,比如:ACE_UINT32, 但是自己使用C++的風(fēng)格是明顯的現(xiàn)代風(fēng)格,以范型為主,所以最近開始逐步替換ACE的代碼,改用boost庫(kù)。
在boost庫(kù)中,standard integer types用來支持跨平臺(tái)的整數(shù)類型,我用的是1.48版本,參考文檔:
boost庫(kù)的整數(shù)實(shí)現(xiàn)基于99 C標(biāo)準(zhǔn),不選98C++標(biāo)準(zhǔn)為基礎(chǔ)是因?yàn)橛行┣闆r下的未定義行為。將來新的C++標(biāo)準(zhǔn)如果規(guī)定了跨平臺(tái)整數(shù)類型的話,boost的這個(gè)庫(kù)可能被廢除。不過現(xiàn)在C++11還沒有編譯器完全支持,也沒有太多選擇。
自己實(shí)現(xiàn)固然可以,不過意味著分發(fā)困難和很多測(cè)試,看明白boost如何實(shí)現(xiàn)的就可以了。沒必要自己干這脹活吧。
注意,總是使用boost::開頭的類型和模板,不要直接使用boost引入的C的標(biāo)準(zhǔn)類型和宏。
現(xiàn)在開始。
boost提供了精確寬度的整數(shù)類型,采用int#_t 命名,#就是位數(shù),比如int8_t 代表有符號(hào)的8位整數(shù)。那么它的真實(shí)對(duì)應(yīng)物是什么?
注意,我這里是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)?\
typedefintint##N##_t?__attribute__?((__mode__?(MODE)))
#?define?__u_intN_t(N,?MODE)?\
typedefunsignedintu_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
用宏替換后,其實(shí)就是:
typedefintint8_t?__attribute__?((__mode__?(__QI__)))
用到了幾個(gè)GCC編譯器的指令
__attribute__, __mode和 __QI__
##是宏的連接符號(hào)。
__QI__就代表最小尋址單元,一個(gè)字節(jié),8位。
__HI__ 以及后面的指令都是8位的若干倍數(shù)。
至于無符號(hào)固定寬度整數(shù)類型,前面加上u,形如:uint#_t 就是無符號(hào)整數(shù)的固定寬度表達(dá)方法。
實(shí)現(xiàn)采用了另一套typedef,沒有用上面的編譯器指令
/*?Unsigned.??*/
typedefunsignedcharuint8_t;
typedefunsignedshortintuint16_t;
#ifndef?__uint32_t_defined
typedefunsignedintuint32_t;
#?define?__uint32_t_defined
#endif
#if?__WORDSIZE?==?64
typedefunsignedlongintuint64_t;
#else
__extension__
typedefunsignedlonglongintuint64_t;
#endif
更新:2013/9/14
不過今天開始啟用C++11,現(xiàn)在有了標(biāo)準(zhǔn)的可用。參考文檔:
幾乎和boost里面的一樣。所以本文標(biāo)題也有所改變。
總結(jié)
以上是生活随笔為你收集整理的boost跨平台 c++_跨平台C++整数类型 之一 固定宽度整数(boost和C++11)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: angularjs1访问子组件_Vue学
 - 下一篇: java对两个表进行排序_Excel工作