久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区


曙海教育集團(tuán)論壇開(kāi)發(fā)語(yǔ)言培訓(xùn)專區(qū)C++語(yǔ)言開(kāi)發(fā) → Unix/Linux下C/C++開(kāi)發(fā)技術(shù)概覽


  共有7876人關(guān)注過(guò)本帖樹形打印

主題:Unix/Linux下C/C++開(kāi)發(fā)技術(shù)概覽

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個(gè)性首頁(yè) | 博客 | 信息 | 搜索 | 郵箱 | 主頁(yè) | UC


加好友 發(fā)短信
等級(jí):青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊(cè):2010-11-12 11:08:23
Unix/Linux下C/C++開(kāi)發(fā)技術(shù)概覽  發(fā)帖心情 Post By:2010-12-10 15:03:09

Windows和Unix是當(dāng)前兩大主流操作系統(tǒng)平臺(tái),基于C/C++的開(kāi)發(fā)人員經(jīng)常會(huì)面臨這兩個(gè)平臺(tái)之間的移植的問(wèn)題。Unix作為一個(gè)開(kāi)發(fā)式的系統(tǒng),其下有出現(xiàn)了很多個(gè)分支,包括Sun的Solaris、IBM的AIX、HP Unix、SCO Unix、Free BSD、蘋果的MAC OS以及開(kāi)源的Linux等。對(duì)于這些Unix的分支操作系統(tǒng),其實(shí)現(xiàn)又有很大的差別,因此開(kāi)發(fā)人員又要針對(duì)這些不同的系統(tǒng)進(jìn)行移植。本文的目的就是介紹一下Windows平臺(tái)和Unix平臺(tái)之間的差別,并簡(jiǎn)單介紹一下不同Unix分支操作系統(tǒng)之間的差別,在移植開(kāi)發(fā)過(guò)程中的一些注意事項(xiàng),同時(shí)簡(jiǎn)要介紹一下Unix下開(kāi)發(fā)的一般流程和常用的開(kāi)發(fā)調(diào)試工具。

關(guān)于平臺(tái)之間的差異,主要是Windows平臺(tái)和Unix平臺(tái)之間的差異,這里著重介紹一下這兩個(gè)平臺(tái)在C/C++開(kāi)發(fā)中存在的差異,其間會(huì)穿插介紹一些Unix不同分支之間的差異。

1.1語(yǔ)言特性的差異

       語(yǔ)言特性的差異,指的是不同操作系統(tǒng)平臺(tái)中,實(shí)現(xiàn)C++/C時(shí)的一些細(xì)微的差異,忽略這些差異可能會(huì)帶來(lái)一些特別隱蔽的錯(cuò)誤。而且可能是致命的錯(cuò)誤。所以,了解語(yǔ)言特性的差異,對(duì)于在Unix移植來(lái)說(shuō)非常重要。如果考慮系統(tǒng)多多個(gè)平臺(tái)支持,就必須了解在不同平臺(tái)下語(yǔ)言特性的差異,從開(kāi)發(fā)一開(kāi)始就把這些因素考慮進(jìn)去,這樣才能最低限度的降低移植的過(guò)程中工作量。

1.1.1字節(jié)順序的差異

       字節(jié)順序指的主要是整型變量在內(nèi)存中的存儲(chǔ)方式。在計(jì)算機(jī)中,數(shù)據(jù)都是以二進(jìn)制方式存儲(chǔ)的,包括在內(nèi)存和硬盤中。而計(jì)算機(jī)又以8位二進(jìn)制作為一個(gè)存儲(chǔ)單元。在32位系統(tǒng)中,一個(gè)整型的存儲(chǔ)需要四個(gè)存儲(chǔ)單元。也就是說(shuō)要把一個(gè)32位的整數(shù)分割成位四段分別進(jìn)行存儲(chǔ),而每一段的存儲(chǔ)位置就是字節(jié)順序的差異。為了清楚的表示每段存儲(chǔ)的先后位置,我們用16進(jìn)制來(lái)表示一段的值,下表列出了在Unix系統(tǒng)和Windows系統(tǒng)中整數(shù)20000在內(nèi)存中的情況。

十六進(jìn)制表示

0x00004E20

Windows內(nèi)存表示

20 4E 00 00

Unix內(nèi)存表示

00 00 4E 20

如表中所示,Windows中存儲(chǔ)方式和該整數(shù)的16進(jìn)制表示是相反,是一種低位在前高位在后的存儲(chǔ)順序。而Unix下的存儲(chǔ)順序和正常的16進(jìn)制表示的順序相同,稱為高位在前低位在后的順序。這種差異帶來(lái)的問(wèn)題,主要體現(xiàn)在以下幾個(gè)方面:

?         網(wǎng)絡(luò)通信時(shí)

當(dāng)Windows和Unix之間發(fā)生網(wǎng)絡(luò)數(shù)據(jù)傳輸,傳輸一個(gè)整型數(shù)據(jù)(如一個(gè)數(shù)據(jù)包的長(zhǎng)度)的時(shí)候,如果不經(jīng)處理直接把內(nèi)存中的數(shù)據(jù)傳輸過(guò)去,那么在對(duì)方看來(lái)完全是另一個(gè)數(shù)據(jù),這樣就會(huì)造成問(wèn)題。如Windows下面發(fā)送過(guò)去一個(gè)20000(0x00004E20),在Unix下面收到的數(shù)據(jù)就會(huì)被理解成541982720(0x204E0000),這簡(jiǎn)直是天壤之別。

?         文件存儲(chǔ)和讀取時(shí)

跟網(wǎng)絡(luò)傳輸類似,如果在Windows下面把某個(gè)整數(shù)寫到了文件中,然后在Unix下面打開(kāi)這個(gè)文件讀取該數(shù)據(jù),就會(huì)出現(xiàn)跟上面類似的問(wèn)題。

       這個(gè)問(wèn)題主要體現(xiàn)在不同平臺(tái)之間互操作時(shí),在多平臺(tái)開(kāi)發(fā)過(guò)程中,尤其時(shí)在網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)的時(shí)候,兩個(gè)平臺(tái)之間數(shù)據(jù)交互是非常普遍的,所以這個(gè)問(wèn)題也就顯的很普遍。解決這個(gè)問(wèn)題的方法就是交互的雙方采用一種相同的數(shù)據(jù)編碼標(biāo)準(zhǔn),就是數(shù)據(jù)在傳輸和存儲(chǔ)的時(shí)候采用什么方法進(jìn)行編碼,具體的做法有一下幾種:

1.  數(shù)字轉(zhuǎn)換成字符傳進(jìn)行交互

2.  協(xié)商一個(gè)同意的字節(jié)順序,根據(jù)自己平臺(tái)的字節(jié)順序還原數(shù)據(jù)

3.  采用其他標(biāo)準(zhǔn)的編碼方式,如ASN1編碼


跟這個(gè)問(wèn)題類似,32位系統(tǒng)和64位系統(tǒng)的差異也會(huì)出現(xiàn)這樣的問(wèn)題,解決方法跟這個(gè)問(wèn)題的解決方法相同。在32位系統(tǒng)和64位系統(tǒng)中,長(zhǎng)整型(long)分別用32位和64位表示,這樣,在不同系統(tǒng)之間交互的時(shí)候必然會(huì)出現(xiàn)整型數(shù)據(jù)表示方式不同的問(wèn)題。目前大多數(shù)Windows系統(tǒng)都是32位的系統(tǒng),而Unix中很多都是64位的,尤其是大型的服務(wù)器,所以這個(gè)問(wèn)題必須引起重視。

1.1.2變量的作用域差異

在不同的系統(tǒng)下,由于編譯器的不同,對(duì)變量作用域的實(shí)現(xiàn)機(jī)制也有所不同,這里以Windows下的VC和Solaris下的CC這兩個(gè)編譯器為例做一個(gè)簡(jiǎn)單的比較說(shuō)明。

在C++的開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)有這樣的用法:

       for(int i=0;i<num;i++)

       {

              …

       }

這是一種最常用的for循環(huán)的用法,因?yàn)槠渲衖主要使用來(lái)控制循環(huán),所以一般沒(méi)有必要拿出來(lái)單獨(dú)進(jìn)行聲明,只是放在for語(yǔ)句中一起聲明。這里i、j等簡(jiǎn)單的變量就成了我們常用的變量,一般不按照編程規(guī)范那樣為他們命名。就是這種聲明方法,在Windows下和Solaris下有了不同的理解,i的作用域不同。我們先把作用域進(jìn)行劃分,如下:

       {

              …

              for(int i=0;i<num;i++)

II

              {

I

                     …

              }

              …

              …

       }


我們劃分出I和II兩個(gè)作用域,其中作用域II包含在作用域I當(dāng)中。在Windows下,變量i的作用域是I的整個(gè)范圍,而Solaris下的i的作用域只是II的范圍。其實(shí)標(biāo)準(zhǔn)的C++語(yǔ)法應(yīng)該是Solaris的做法,但是微軟在實(shí)現(xiàn)的時(shí)候沒(méi)有按照這個(gè)標(biāo)準(zhǔn)實(shí)現(xiàn),這就引發(fā)了我們討論的這個(gè)問(wèn)題。由于這個(gè)差異,就引發(fā)了一些微妙而隱蔽的問(wèn)題。先看一下下面兩端代碼。

A:

       for(int i=0;i<num;i++)

       {

              …

       }

       …

       for(i=0;i<num;i++)

       {

              …

       }


B:

       for(int i=0;i<num;i++)

       {

              …

       }

       …

       for(int i=0;i<num;i++)

       {

              …

       }


代碼A在Windows下面可以正常編譯,而在Solaris下面確編不過(guò)去,提示第二個(gè)for循環(huán)中變量i沒(méi)有定義。相反代碼B在Solaris下可以正常編譯,而在Windows下面編不過(guò)去,提示第二個(gè)for循環(huán)中變量i重復(fù)定義。

在通常的情況下,我們會(huì)按照B的方法書寫代碼,而在Windows編譯是出現(xiàn)錯(cuò)誤,然后改成A的那種形式。這樣,在Windows下就沒(méi)有問(wèn)題了,程序也可以編譯過(guò)去了,但是到Solaris下時(shí),有會(huì)出現(xiàn)問(wèn)題,這是就不得不把i的聲明拿到所有for循環(huán)的外面。當(dāng)i的聲明拿到for循環(huán)的外面時(shí),真正的問(wèn)題來(lái)了。首先提示一下,這樣的一段代碼是沒(méi)有問(wèn)題的:

C:

int i = 0;

if(cond)

{

       …

       for(int i=0;i<num;i++)

       {

              …

       }

       …

}

       這是一段正確的代碼,雖然在外面已經(jīng)定義了i,但是在for里面重新定義一個(gè)i也沒(méi)有問(wèn)題,這是C++的語(yǔ)法所允許的(java里面不允許這樣做)。但就是因?yàn)檫@種C++語(yǔ)言的靈活機(jī)制,引發(fā)了問(wèn)題的產(chǎn)生。

       問(wèn)題產(chǎn)生源于程序中出現(xiàn)了A_B那樣的代碼,然后把i的聲明拿到了外面。在后期維護(hù)的過(guò)程中,又在后面增加了一個(gè)循環(huán),但是卻是按照C的那種方式增加的,這樣就產(chǎn)生了問(wèn)題。請(qǐng)看如下代碼:

       int i=0;

       char str1[10];

       char str2[10];

       strcpy(str1,”hello”);

       …

       for(i=0;i<20;i++)

       {

              …

I

       }

       …

       if(cond)

       {

              for(int i=0;i<10;i++)

III

              {

II

                     if(str1[i]==0)  break;

              }

              memcpy(str2,str1,i);

              str2[i]=0;

       }

       …


在上述代碼,為了分析方便,我們把整段代碼分成I、II和III三個(gè)作用域。其中作用域II就是整個(gè)if語(yǔ)句,實(shí)現(xiàn)的相當(dāng)于一個(gè)strcpy函數(shù)的功能。II中的內(nèi)容就好是我們上面說(shuō)的后期維護(hù)中加入的,當(dāng)然,實(shí)際情況并不像我們例子中這么明前,i的聲明可能離我們的if語(yǔ)句很遠(yuǎn),所以加入這段代碼是不知道上面是否聲明了i變量。而且,這段代碼編譯的時(shí)候也不回出錯(cuò),不管是Windows還是Solaris(單獨(dú)的一段II中的代碼在Solaris下面編不過(guò)去)。在Windows下面,這段代碼可以正常的運(yùn)行,不回出現(xiàn)任何問(wèn)題,因?yàn)镮I中的代碼完全是根據(jù)Windows下的習(xí)慣編寫的。但是在Solaris下面,這段代碼就會(huì)出現(xiàn)內(nèi)存越界的錯(cuò)誤,雖然編譯可以正常通過(guò),但是實(shí)現(xiàn)的卻不是程序員預(yù)期的目的。在執(zhí)行memcpy的時(shí)候,那個(gè)i其實(shí)是外層聲明的那個(gè)i,值是20,而str2和str1的大小之后10,所以就發(fā)生了讀寫內(nèi)存越界。而程序員預(yù)想的,這個(gè)i是for循環(huán)算出來(lái)的str1字符串的長(zhǎng)度,應(yīng)該是5。

要解決這類問(wèn)題,就得加強(qiáng)編程規(guī)范,杜絕這種錯(cuò)誤代碼的生成。從開(kāi)始的時(shí)候就要意識(shí)到可能產(chǎn)生的問(wèn)題,從而避免問(wèn)題的發(fā)生。


支持(0中立(0反對(duì)(0單帖管理 | 引用 | 回復(fù) 回到頂部

返回版面帖子列表

Unix/Linux下C/C++開(kāi)發(fā)技術(shù)概覽








簽名
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
欧美一区二区三区视频| 成人app网站| 国产精品久久久一区二区三区| 欧美一级日韩免费不卡| 狠狠色综合色综合网络| 欧美唯美清纯偷拍| 免费看黄色91| 在线观看中文字幕不卡| 蜜臀av性久久久久蜜臀aⅴ| 一本一道久久a久久精品| 视频一区二区三区在线| 色综合久久综合| 日韩二区在线观看| 在线欧美一区二区| 久热成人在线视频| 制服.丝袜.亚洲.中文.综合| 国模大尺度一区二区三区| 欧美高清www午色夜在线视频| 精品一区二区综合| 在线播放亚洲一区| 国产白丝精品91爽爽久久| 欧美成人猛片aaaaaaa| 不卡的电视剧免费网站有什么| 日韩欧美黄色影院| 99re6这里只有精品视频在线观看| 久久久久久影视| 国产主播一区二区三区四区| 中文字幕五月欧美| 日韩一区二区三区高清| 日韩av二区在线播放| 欧美日韩你懂得| av中文一区二区三区| 国产农村妇女精品| 手机成人在线| 国产最新精品精品你懂的| 欧美大黄免费观看| 国产在线精品一区二区中文 | 日韩国产欧美在线播放| 在线观看不卡一区| 国产精品一区二区三区四区| 欧美videossexotv100| 91网站最新网址| 亚洲丝袜精品丝袜在线| 一区二区三区四区不卡| 国产精品一区2区| 国产三级久久久| 日本一区二区在线视频| 蜜臀99久久精品久久久久久软件| 日韩三级精品电影久久久| 国产精品国模大尺度私拍| 亚洲资源中文字幕| 欧美日韩国产天堂| 97人人澡人人爽| 亚洲电影视频在线| 欧美精品在线视频| 国产精华一区| 日韩精彩视频在线观看| 日韩精品一区二区三区在线播放| 国内精品二区| 蜜桃在线一区二区三区| 久久久亚洲综合| 自拍偷拍亚洲色图欧美| aaa欧美大片| 亚洲福利视频三区| 91精品久久久久久久91蜜桃 | 亚洲五码中文字幕| 欧美精品亚洲二区| 精品视频一区在线| 麻豆精品一区二区三区| 国产精品丝袜久久久久久app| 一区二区国产日产| aa日韩免费精品视频一| 免费在线观看成人| 国产无遮挡一区二区三区毛片日本| 在线不卡日本| 国产精品一区二区不卡视频| 久久99国产精品久久99| 国产精品成人一区二区艾草| 欧美精品在欧美一区二区少妇| 精品国产一区二区三区免费| 国产在线看一区| 亚洲丝袜精品丝袜在线| 日韩一区二区三区在线观看| 日韩欧美三级电影| 97超碰资源| 国内外精品视频| 亚洲在线免费播放| 久久精品一区二区三区av| 欧美撒尿777hd撒尿| 欧美日韩一区综合| 91蜜桃在线观看| 久久精品二区亚洲w码| 亚洲精品欧美激情| 国产午夜精品久久久久久久| 日本精品一区二区三区四区的功能| 国产亚洲情侣一区二区无| 国产成人啪午夜精品网站男同| 亚洲福利视频一区| 中文字幕在线观看不卡| 欧美成人官网二区| 欧美亚洲一区二区三区四区| 欧美激情专区| 成人动漫在线视频| 不卡高清视频专区| 久久99蜜桃精品| 午夜私人影院久久久久| 一区二区三区日韩精品视频| 久久久99精品免费观看不卡| 欧美日韩国产首页| 亚洲一区二区三区精品视频| 精品一区二区国产| 91欧美激情一区二区三区成人| 国产一区二区三区四区五区入口 | 污视频在线免费观看一区二区三区 | 亚洲午夜精品久久久久久浪潮| 精品亚洲一区二区三区四区五区高| 91小视频在线| 不卡欧美aaaaa| 国产成人自拍在线| 国产在线播放一区| 韩国理伦片一区二区三区在线播放| 性做久久久久久| 亚洲图片自拍偷拍| 亚洲综合激情网| 一区二区三区在线视频观看| 中文字幕一区二区三区av| 久久久美女毛片| 久久免费看少妇高潮| 精品国产一区久久| 日韩欧美一级精品久久| 日韩色视频在线观看| 欧美一区欧美二区| 日韩欧美成人激情| 日韩一区二区三区视频| 日韩亚洲电影在线| 欧美一区二区日韩一区二区| 欧美精品777| 91精品国产综合久久香蕉麻豆| 欧美日韩成人在线| 91精品国产乱| 日韩欧美不卡在线观看视频| 日韩欧美一区中文| 精品理论电影在线观看 | 51国产成人精品午夜福中文下载 | 国产精品国产精品国产专区不蜜| 国产网站一区二区| 欧美韩国日本综合| 中文字幕人成不卡一区| 亚洲欧洲日韩女同| 亚洲男人的天堂一区二区| 亚洲精品国产视频| 亚洲国产精品自拍| 美女被吸乳得到大胸91| 久久99国产精品久久99| 国产伦精品一区二区三区在线观看| 国产一本一道久久香蕉| 波多野结衣亚洲| 国产精品一区在线观看| 欧美午夜视频在线| 在线看视频不卡| 欧美色涩在线第一页| 51精品视频一区二区三区| 精品国产三级电影在线观看| 国产亚洲一二三区| 亚洲男同性恋视频| 日韩国产精品91| 国产在线播放一区| 99国产精品久久久久| 久久综合毛片| 色狠狠综合天天综合综合| 8v天堂国产在线一区二区| 精品国产凹凸成av人网站| 国产精品三级视频| 午夜日韩在线电影| 国产精品综合网| 91一区二区三区| 婷婷亚洲婷婷综合色香五月| 国产精品日韩欧美一区二区| 日韩欧美99| 欧美乱熟臀69xxxxxx| 2021国产精品久久精品| 亚洲欧美日韩中文播放| 麻豆国产精品视频| 99国内精品久久| 日本不卡久久| 在线播放/欧美激情| 国产亚洲欧洲997久久综合| 亚洲国产精品一区二区久久恐怖片| 精品一区二区影视| 国产98在线|日韩| 色诱亚洲精品久久久久久| 日韩欧美美女一区二区三区| 亚洲欧美日韩国产手机在线 | 884aa四虎影成人精品一区| 国产色产综合产在线视频| 亚洲午夜精品17c| 成人三级在线视频| 日本一区二区在线| 日韩一级在线观看| 一区二区三区四区五区视频在线观看|