• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            網(wǎng)絡(luò)服務(wù)器軟件開發(fā)/中間件開發(fā),關(guān)注ACE/ICE/boost

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks

               幾乎每個(gè)像樣的庫,都會(huì)有自己定義的類型系統(tǒng),如U8,U16等等,下面是摘選自resiprocate-1.4\rutil\stun\Stun.hxx的,
               

            #ifndef RESIP_COMPAT_HXX
            // define some basic types
            typedef unsigned char  UInt8;
            typedef unsigned 
            short UInt16;
            #ifdef __APPLE__
            typedef unsigned 
            long   UInt32;
            #else
            typedef unsigned 
            int   UInt32;
            #endif
            #if defined( WIN32 )
            typedef unsigned __int64 UInt64;
            #else
            typedef unsigned 
            long long UInt64;
            #endif
            #endif

            typedef 
            struct { unsigned char octet[16]; }  UInt128;
               隨著64位服務(wù)器的逐漸普及,int類型在32位和64位機(jī)下代表的字節(jié)數(shù)可能不再相同,這對現(xiàn)有的服務(wù)器的協(xié)議解析會(huì)造成一定麻煩,比如,協(xié)議解析時(shí),可能有,
            int nCmdType = (int)ptr;
            ptr += 4;
               所以,自己在開發(fā)底層庫時(shí),封裝一下基本類型,既提高了可讀性,也易于移植
            posted on 2009-02-02 10:51 true 閱讀(3095) 評(píng)論(12)  編輯 收藏 引用 所屬分類: C++基礎(chǔ)linux

            Feedback

            # re: 對基本類型的再包裝,方便了移植 2009-02-02 21:18 Dancefire
            在1999年以前,你這么做是合理的。但是1999年C99標(biāo)準(zhǔn)推出以后,這樣做就已經(jīng)不合理了。你應(yīng)該使用C99的標(biāo)準(zhǔn)頭文件<stdint.h>,如果是C++的話,應(yīng)該使用<cstdint>。

            在stdint.h中,標(biāo)準(zhǔn)明確要求定義:

            int8_t;
            int16_t;
            int32_t;
            int64_t;



            uint8_t;
            uint16_t;
            uint32_t;
            uint64_t;

            有關(guān)C99的stdint.h的信息請參考wikipedia上的介紹:
            http://en.wikipedia.org/wiki/Stdint.h
            http://www.opengroup.org/onlinepubs/009695399/basedefs/stdint.h.html

            c++委員會(huì)已經(jīng)把cstdint納入TR1中,并已經(jīng)列入c++09的標(biāo)準(zhǔn)中,今年內(nèi)就會(huì)稱為c++標(biāo)準(zhǔn)的一部分。

            這些類型的定義,將有所用的編譯器和庫保證其平臺(tái)間一致性。gcc和unix下很多C或者C++編譯器的用戶已經(jīng)隨時(shí)可以使用<stdint.h>或者<cstdint>,因?yàn)間cc支持c99標(biāo)準(zhǔn),并且libstdc++也包含了<cstdint>。至于Windows用戶而言,稍有不幸,因?yàn)槲④浀木幾g器不支持c99標(biāo)準(zhǔn),所以沒有<stdint.h>這個(gè)文件,這也可能是樓主不知道這個(gè)文件的主要原因。但是沒關(guān)系,boost庫提供了tr1的完整實(shí)現(xiàn),其中自然包含了<cstdint>,只要引入<boost/cstdint.hpp>就可以使用上述類型而不用擔(dān)心跨平臺(tái)性。當(dāng)然,一如既往,boost提供了更多的可移植性基礎(chǔ)類型的定義。

            http://www.boost.org/doc/libs/1_37_0/libs/integer/cstdint.htm

            請樓主參考這些信息修改文章,畢竟在標(biāo)準(zhǔn)可用下,使用標(biāo)準(zhǔn)更合理。  回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-02-03 08:59 true
            @Dancefire
            謝謝,你的提醒!剛才查看了linux,在/usr/include目錄下存在stdint.h,但在windows下沒有此文件:VC6和VC8下都沒有,不知道VC9下如何。像這種情況,也只能自己定義了  回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-02-03 11:37 陳梓瀚(vczh)
            C99相當(dāng)一部分不在C++里面,所以微軟的編譯器不支持是很正常的。  回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-02-03 12:00 Dancefire
            @true

            我的回復(fù)中已經(jīng)提到,因?yàn)槲④浬胁恢С謈99標(biāo)準(zhǔn),因此vc用戶享受標(biāo)準(zhǔn)提供的便利會(huì)有些麻煩。

            但是我也提到了,<cstdint>已經(jīng)被提到TR1并且進(jìn)而提到了c++09標(biāo)準(zhǔn)中了,因此,各大編譯器已經(jīng)都開始支持<cstdint>了。對于gcc用戶自然沒問題。對于vc用戶,有很多
            種辦法可以提前使用c++09的一些庫:

            1) 下載微軟vc2008 Feature Pack,里面提供了TR1的實(shí)現(xiàn),其中包含我提到的頭文件。

            2) 更簡單一些,安裝boost,使用<boost/cstdint.hpp>文件,里面也是按照TR1標(biāo)準(zhǔn)/c99標(biāo)準(zhǔn)實(shí)現(xiàn)的跨平臺(tái)統(tǒng)一的類型文件。

            3) 使用第三方的c++標(biāo)準(zhǔn)庫,如apache的stdcxx,里面也基本上支持了TR1,包含了我說的頭文件。

            因此完全不用自己定義。更何況自己定義的很難符合跨cpu,跨系統(tǒng)的統(tǒng)一性。而我說的這些實(shí)現(xiàn),由于按照標(biāo)準(zhǔn),已經(jīng)支持幾十種系統(tǒng)和cpu的組合了,為什么還要自己定義呢?拿來用就好了。

            如果僅僅是擔(dān)心vc和其它環(huán)境不兼容,那大不了從mingw中把stdint.h拷過來,然后按照vc環(huán)境改一改就可以了。這樣在vc環(huán)境下include這個(gè)頭文件,其它環(huán)境下使用標(biāo)準(zhǔn)頭文件。除了微軟外的編譯器基本上都支持c99,因此不用擔(dān)心其他平臺(tái)的兼容性。

              回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-02-03 12:38 true
            @Dancefire
            你說的這三種方法,目前都不能實(shí)現(xiàn),公司的系統(tǒng)不能使用第三方庫,現(xiàn)在ace也放棄了,而且需要兼容VC6,各種 版本的linux。類似的問題,還有__VA_ARGS__等。這樣雖然會(huì)有造輪子的嫌疑,但長期來看,對系統(tǒng)的維護(hù)會(huì)更容易,得大于失吧。  回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-02-03 12:56 Dancefire
            @true

            那就不使用第三方庫好了。boost的頭文件可以直接拷過來用,修改一下當(dāng)成自己的,算不得第三方庫了吧?或者從mingw中把stdint.h拷過來也行,那個(gè)是針對win32平臺(tái)修改過的stdint.h。就一個(gè)頭文件而已,也算不得第三方庫吧?對于這個(gè)頭文件而言,VC6是肯定兼容的,最多稍微修改一下不會(huì)太費(fèi)力氣。

            對于類型而言,應(yīng)該使用標(biāo)準(zhǔn)所制定的跨平臺(tái)一致性類型。但是vc不支持,因?yàn)槲覀兲砑觽€(gè)頭文件讓其支持標(biāo)準(zhǔn)。這樣就可以保證和所有支持c99系統(tǒng)的一致性了。比如linux,甚至freebsd或者netbsd,或者darwin/macos。

            所以,在已存在標(biāo)準(zhǔn)這個(gè)前提下,那么問題應(yīng)該描述為如何為vc補(bǔ)全所需標(biāo)準(zhǔn)的內(nèi)容。這很簡單,遵循標(biāo)準(zhǔn)定義,或者直接那別人已經(jīng)定義好的頭文件過來就ok了。也不依賴任何第三方庫。

            關(guān)于你說的__VA_ARGS__,也是C99標(biāo)準(zhǔn)的一部分,所有支持c99的編譯器都支持,包括gcc。
            http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

            VC2005開始以后都支持了。
            http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx

            因此之前的版本如果不支持,那應(yīng)該設(shè)法為vc6定義一個(gè)__VA_ARGS__的宏,來使之支持相應(yīng)的標(biāo)準(zhǔn)。

            原則就是,凡是在標(biāo)準(zhǔn)中已經(jīng)明確定義的東西,那么誰不支持標(biāo)準(zhǔn),就讓誰符合標(biāo)準(zhǔn)。而不要自己重復(fù)造輪子,因?yàn)槟銦o法保證你定義的類型在多系統(tǒng)下兼容,畢竟你接觸和使用的系統(tǒng)有限。何不只讓不符合標(biāo)準(zhǔn)的符合標(biāo)準(zhǔn),至于其他支持標(biāo)準(zhǔn)的系統(tǒng),自然不用你來操心。
              回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-02-03 13:29 true
            @Dancefire
            你的回復(fù)很好“凡是在標(biāo)準(zhǔn)中已經(jīng)明確定義的東西,那么誰不支持標(biāo)準(zhǔn),就讓誰符合標(biāo)準(zhǔn)”是一種思路,只考慮win和linux,看下面lib.h這種用法

            #ifdef WIN32
            typedef unsigned char int8_t;
            typedef unsigned short int16_t;
            #else
            #include <stdint.h>
            #endif
            我覺得還是很少這樣寫的,在導(dǎo)出的頭文件lib.h中,最起碼現(xiàn)在我用的2個(gè)商用平臺(tái)沒有這樣的--->導(dǎo)出的lib.h中都不會(huì)再包含其他頭文件  回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-02-03 16:28 Digital_life
            從你們的對話中受益良多,  回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-02-04 09:03 夢在天涯
            @Dancefire
            很不錯(cuò)!說的很好啊!  回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-02-04 09:08 夢在天涯
            @Dancefire
            的意思是說要想編寫可以跨平臺(tái)的程序,就要用UInt32,等,不直接使用int,long等嗎?  回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-02-04 09:48 Dancefire
            @夢在天涯
            不是自定義的UInt32,而是標(biāo)準(zhǔn)中的uint32_t或者,int32_t之類。自定義的類型是無法保證這一點(diǎn)的。

            是否使用這類確保跨平臺(tái)一致性的類型,關(guān)鍵在于你的應(yīng)用在使用這些類型的時(shí)候是否關(guān)注其大小。比如你僅僅是進(jìn)行個(gè)for-loop,或者簡單的計(jì)數(shù)或者確定數(shù)字不是很大的計(jì)算,那自然無所謂了。

            但是比如你要把一個(gè)數(shù)字以二進(jìn)制格式存儲(chǔ)到硬盤上,或者要進(jìn)行網(wǎng)絡(luò)通訊,其內(nèi)容是某結(jié)構(gòu)體等,或者某些變量需要至少多少位的空間才能夠滿足需求。碰到這類比較關(guān)心實(shí)際占用空間大小的問題,而且系統(tǒng)是跨平臺(tái)的,那么就需要考慮使用標(biāo)準(zhǔn)中具有跨平臺(tái)一致性的類型了。那些是由編譯器會(huì)保證跨平臺(tái)大小一致的。  回復(fù)  更多評(píng)論
              

            # re: 對基本類型的再包裝,方便了移植 2009-06-19 09:25 dvb-dvb
            我也遇到這個(gè)問題了,
            TS Analyser TooL:
            http://www.cnitblog.com/dvb-dvb/archive/2009/03/20/55573.html  回復(fù)  更多評(píng)論
              

            7国产欧美日韩综合天堂中文久久久久| 国产国产成人久久精品| 国产成人精品综合久久久久| 无码国内精品久久人妻| 色综合久久精品中文字幕首页| 99久久人人爽亚洲精品美女| 国内精品久久久久国产盗摄| 久久精品国产亚洲精品| 精品久久久中文字幕人妻 | 国产成人精品久久综合| 久久国产视频99电影| 亚洲精品乱码久久久久久自慰| 国产精品99久久不卡| 国产成人精品白浆久久69| 亚洲欧美精品一区久久中文字幕| 国产成人久久激情91| 亚洲中文精品久久久久久不卡| 久久天天日天天操综合伊人av| 色偷偷88888欧美精品久久久| 亚洲国产成人精品无码久久久久久综合 | 一本大道加勒比久久综合| 性欧美大战久久久久久久久| 亚洲国产成人久久笫一页| 国产亚州精品女人久久久久久 | 无码伊人66久久大杳蕉网站谷歌| 久久伊人色| 看全色黄大色大片免费久久久 | 国产精品久久久久影院色| 欧美精品久久久久久久自慰| 久久99精品久久久大学生| 尹人香蕉久久99天天拍| 亚洲精品成人网久久久久久| 精品国产一区二区三区久久蜜臀| 久久这里只有精品首页| 国产精品久久久久久影院| 久久青青草原综合伊人| 亚洲国产天堂久久综合网站 | 精品久久久久久中文字幕大豆网| 久久无码AV一区二区三区| 思思久久99热只有频精品66| 久久狠狠爱亚洲综合影院 |