久久中文视频-久久中文网-久久中文亚洲国产-久久中文字幕久久久久-亚洲狠狠成人综合网-亚洲狠狠婷婷综合久久久久


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


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

主題: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、蘋(píng)果的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ù)寫(xiě)到了文件中,然后在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的方法書(shū)寫(xiě)代碼,而在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í)慣編寫(xiě)的。但是在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ā)生了讀寫(xiě)內(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ù)概覽








簽名
主站蜘蛛池模板: 一级毛片在线免费观看 | 国产永久在线视频 | 国产91丝袜美腿在线观看 | 不卡国产视频 | 国产成人香蕉在线视频网站 | 免费在线观看一区二区 | 欧美激情欧美狂野欧美精品免费 | 国内精品美女写真视频 | 免费人成在线观看网站视频 | 99久久精品免费观看区一 | 欧美成a人片在线观看久 | 欧美成人日韩 | 荡公乱妇蒂芙尼中文字幕 | 精品成人在线观看 | 国产一区二区三区在线免费观看 | 日韩精品免费视频 | 91久久99久91天天拍拍 | 色多多香蕉 | 亚洲精品综合一区在线 | 99精品国产在热久久 | 成人精品综合免费视频 | 国产精品hd在线播放 | 麻豆国产96在线 | 中国 | 久久视频这里只有精品 | 久久综合99re久久爱 | 俄罗斯一级黄色片 | 国产亚洲精品久久久久91网站 | 亚洲精品国产一区二区三区四区 | 三级在线国产 | 成年人网站免费在线观看 | 亚洲国产精品久久人人爱 | 国产91久久最新观看地址 | 日韩欧美一及在线播放 | 精品中文字幕久久久久久 | 香蕉久久夜色精品国产2020 | 欧美h版成版在线观看 | 天天鲁天天爱天天鲁天天 | 特级aaaaaaaaa毛片免费视频 | 久久国产精品免费看 | 福利视频专区 | 国产区精品在线 |