欧美自拍小视频_国产片在线免费观看_中文字幕啪啪_成人av高清在线_欧美一区二区视频免费观看_亚洲国产激情


曙海教育集團(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ù)概覽








簽名
主站蜘蛛池模板: 妇女被猛烈进入在线播放 | 中文亚洲av片不卡在线观看 | 天堂视频在线免费观看 | 韩国美女vip内部2020 | 人人狠狠综合久久亚洲婷婷 | 亚洲国产成人久久一区久久 | 国产肥白大熟妇bbbb | 亚洲日本va中文字幕久久 | 精品国产乱码久久久久久口爆网站 | 老司机免费在线观看视频 | 久久免费福利视频 | 欧美激情一区二区亚洲专区 | 欧美日韩高清一区二区三区 | 初尝人妻少妇中文字幕 | 免费a级片在线观看 | 精品无码国产一区二区三区av | 国产精品成人影院在线观看 | 人妻少妇精品视频一区二区三区 | 日本网址 | 国产成人精品a视频 | 草草视频免费观看 | 97精品依人久久久大香线蕉97 | 日韩在线不卡免费视频一区 | 国产精品9999久久久久 | 欧美一区二区三区免费高 | 在线观看免费av网 | 黄色毛片视频校园交易 | 欧美精品午夜毛片免费看 | 国产精品亚洲二区在线 | 五月久久亚洲七七综合中文网 | 国产永久 | 国产免费观看a大片的网站 国产免费观看久久黄av片 | 熟妇人妻中文字幕 | 污片在线观看免费 | 精品亚洲77777www | 亚洲人成黄网在线观看 | 成人午夜视频在线观看 | 亚洲精品久久99久久一 | 欧美成人aaa片一区国产精品 | 亚洲欧美日本a∨在线观看 亚洲欧美日本国产 | 久久最新精品 |