C與C++跨平臺(tái)編碼教程(概論)_第1頁(yè)
C與C++跨平臺(tái)編碼教程(概論)_第2頁(yè)
C與C++跨平臺(tái)編碼教程(概論)_第3頁(yè)
C與C++跨平臺(tái)編碼教程(概論)_第4頁(yè)
C與C++跨平臺(tái)編碼教程(概論)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C/C++跨平臺(tái)編碼概論C&C++跨平臺(tái)編碼教程(概論)關(guān)于預(yù)編譯宏#pragmaWindowsWindows使用的#pragmaonce來(lái)防止頭文件重復(fù)引用Windows/Linux在跨平臺(tái)的代碼中,我們使用#ifndef…#define…#endif宏來(lái)實(shí)現(xiàn)這個(gè)功能C&C++跨平臺(tái)編碼教程(概論)#includeWindowsWindows中的#include中可以使用“\”,而且路徑名稱(chēng)大小寫(xiě)并無(wú)區(qū)別。例如下面的寫(xiě)法是等效的:#include“..\\ACE.h”#include“../ACE.h”#include“..\\ace.h”Windows/Linux跨平臺(tái)的代碼中,#include中只能使用“/”(同網(wǎng)址中使用的相同),而且路徑名、文件名都是大小寫(xiě)敏感的:#include“..\\ACE.h”(錯(cuò)誤)#include“ACE.h”與#include”ace.h”不等效C&C++跨平臺(tái)編碼教程(概論)開(kāi)發(fā)工具WindowsWindows中我們通常都使用VisualStudio系列的開(kāi)發(fā)工具來(lái)開(kāi)發(fā)程序代碼Windows/Linux跨平臺(tái)的代碼也可以使用VisualStudio系列的開(kāi)發(fā)工具來(lái)開(kāi)發(fā),這與Windows程序一樣。不同的是我們并不使用MS提供的SDK(比如MFC),而是使用C++標(biāo)準(zhǔn)庫(kù)(VC已支持)和一些支出跨平臺(tái)的SDK(比如ACE)提供的庫(kù)C&C++跨平臺(tái)編碼教程(概論)字符串處理WindowsWindows中,我們使用CString來(lái)處理字符串。Windows/Linux跨平臺(tái)代碼中,我們使用C++標(biāo)準(zhǔn)庫(kù)的std::string來(lái)處理字符串,這個(gè)類(lèi)對(duì)應(yīng)的頭文件是<string>。C++標(biāo)準(zhǔn)庫(kù)還提供了流操作來(lái)處理字符串,比如std::stringstream,這個(gè)類(lèi)對(duì)應(yīng)的頭文件是<sstream>。C&C++跨平臺(tái)編碼教程(概論)多語(yǔ)言處理MVC原則MVC將系統(tǒng)分成了原始數(shù)據(jù)層,控制/映射層和視圖層。在這三個(gè)層次中,只有原始數(shù)據(jù)層和視圖層才可以處理多語(yǔ)言的問(wèn)題,控制/映射層不應(yīng)該介入此問(wèn)題。I/O處及時(shí)處理原則當(dāng)我們需要進(jìn)行字符集轉(zhuǎn)換時(shí),請(qǐng)?jiān)贗/O附近就完成這一功能。所謂的I/O附近是指跨越模塊、系統(tǒng)、文件讀寫(xiě)操作等邊界的附近。這樣做可以讓模塊內(nèi)部、系統(tǒng)內(nèi)部的其它代碼免于字符串轉(zhuǎn)換的負(fù)擔(dān),簡(jiǎn)化系統(tǒng)維護(hù)的難度和定位問(wèn)題的難度。無(wú)論是否要跨平臺(tái),在處理文字的時(shí)候,我們都會(huì)遇到多種字符集的問(wèn)題。這里我們提供兩條原則來(lái)解決這一問(wèn)題:C&C++跨平臺(tái)編碼教程(概論)基本變量類(lèi)型WindowsWindows下,我們使用的是MS提供的一套變量類(lèi)型,比如DWORD,WORD…Windows/Linux跨平臺(tái)方式下,我們使用的是支持跨平臺(tái)的SDK提供的變量類(lèi)型。以ACESDK為例,我們使用的變量類(lèi)型是ACE_UINT8,ACE_UINT32…C&C++跨平臺(tái)編碼教程(概論)指針32位系統(tǒng)在32位系統(tǒng)中,有時(shí)我們需要將指針轉(zhuǎn)換成整形變量。比如將指針用作map的key。如果我們要使用整形變量保存指針,使用int或long就行了。32位/64位系統(tǒng)在跨平臺(tái)時(shí),我們使用typedef來(lái)

解決這個(gè)問(wèn)題。比如在基于ACESDK的開(kāi)發(fā)中,我

使用了如下方法:#ifndef_ACE_POINTER_KEY_TYPE_#define_ACE_POINTER_KEY_TYPE_#ifndefACE_WIN64typedefACE_UINT32ACE_PointerKey;//For32bitsOS.#elsetypedefACE_UINT64ACE_PointerKey;//For64bitsOS.#endif#endif//_ACE_POINTER_KEY_TYPE_C&C++跨平臺(tái)編碼教程(概論)listWindowsWindows中,我們使用MS提供的CList類(lèi)及其子類(lèi)。Windows/Linux在跨平臺(tái)時(shí),我們使用的是C++標(biāo)準(zhǔn)庫(kù)提供的std::list類(lèi)。C&C++跨平臺(tái)編碼教程(概論)mapWindowsWindows中我們使用MS提供的CMap類(lèi)及其子類(lèi)。其實(shí)MS的CMap類(lèi)嚴(yán)格意義上說(shuō)只能算是一個(gè)哈希表,算不上樹(shù)結(jié)構(gòu)。Windows/Linux在跨平臺(tái)時(shí),我們使用C++標(biāo)準(zhǔn)庫(kù)提供的std::map類(lèi)。C&C++跨平臺(tái)編碼教程(概論)線(xiàn)程WindowsWindows中,MS提供了CWinThread和CThread兩個(gè)類(lèi)來(lái)創(chuàng)建線(xiàn)程Windows/Linux在跨平臺(tái)時(shí),由于線(xiàn)程、互斥鎖、信號(hào)都是與OS相關(guān)的,所以我們只能使用支持跨平臺(tái)的SDK提供的類(lèi)庫(kù)。比如在ACE中,我們可以使用ACE_Thread::spawn來(lái)創(chuàng)建線(xiàn)程。C&C++跨平臺(tái)編碼教程(概論)互斥鎖WindowsWindows中,MS提供了CCritialSection,CMutex等互斥鎖。Windows/Linux在跨平臺(tái)時(shí),由于線(xiàn)程、互斥鎖、信號(hào)都是與OS相關(guān)的,所以我們只能使用支持跨平臺(tái)的SDK提供的類(lèi)庫(kù)。比如在ACE中,我們使用ACE_Thread_Mutex、ACE_Recursive_Thread_Mutex等互斥鎖。為了避免像MS中那樣忘了釋放互斥鎖,ACE還提供了ACE_GUARD宏來(lái)自動(dòng)完成釋放操作。C&C++跨平臺(tái)編碼教程(概論)信號(hào)WindowsWindows中,MS提供CreateEvent函數(shù)來(lái)創(chuàng)建信號(hào),WaitForSingleObject等函數(shù)來(lái)使用信號(hào)。Windows/Linux在跨平臺(tái)時(shí),由于線(xiàn)程、互斥鎖、信號(hào)都是與OS相關(guān)的,所以我們只能使用支持跨平臺(tái)的SDK提供的類(lèi)庫(kù)。比如在ACE中,我們使用ACE_Auto_Event和ACE_Manual_Event來(lái)實(shí)現(xiàn)這些功能。C&C++跨平臺(tái)編碼教程(概論)動(dòng)態(tài)分配內(nèi)存WindowsWindows中,我們使用new/delete或者malloc/realloc/free來(lái)動(dòng)態(tài)分配、釋放內(nèi)存。其中,無(wú)論是new一個(gè)數(shù)組還是一個(gè)變量,我們都可以使用delete來(lái)釋放內(nèi)存Windows/Linux在跨平臺(tái)中,我們也是使用new/delete或者malloc/realloc/free來(lái)動(dòng)態(tài)分配、釋放內(nèi)存。不過(guò),與Windows不同,new一個(gè)數(shù)組必須使用delete[]來(lái)釋放,new一個(gè)變量必須使用delete來(lái)釋放。否則在Linux中會(huì)導(dǎo)致堆棧異常。C&C++跨平臺(tái)編碼教程(概論)字節(jié)對(duì)齊WindowsWindows中我們使用#pragmapack宏來(lái)聲明字節(jié)對(duì)齊的方式。LinuxLinux中我們使用__attribute__((aligned(n)))和__attribute__((packed))來(lái)聲明字節(jié)對(duì)齊的方式。我們通過(guò)宏定義+WIN32宏來(lái)實(shí)現(xiàn)代碼跨平臺(tái):#ifdefWIN32#pragmapack(push)#pragmapack(4)#endif#ifndefPRAGMA_PACK_4#ifdefWIN32#definePRAGMA_PACK_4#else#definePRAGMA_PACK_4__attribute__((aligned(4)))#endif//WIN32#endif//PRAGMA_PACK_4structtagCOMMON_STREAM_DATA{ ACE_UINT32length; ACE_UINT8data[0];}PRAGMA_PACK_4;C&C++跨平臺(tái)編碼教程(概論)namespaceWindowsWindows內(nèi)核與Linux不同,同名的兩個(gè)類(lèi)我們可以封裝在不同的動(dòng)態(tài)庫(kù)中,通過(guò)動(dòng)態(tài)加載就可以同時(shí)使用了。LinuxLinux中,同名的兩個(gè)類(lèi)即使封裝在兩個(gè)不同的動(dòng)態(tài)庫(kù)中,內(nèi)核也會(huì)認(rèn)為是同一個(gè)類(lèi)。只要任何一個(gè)類(lèi)被內(nèi)核加載了,另一個(gè)同名類(lèi)便再無(wú)機(jī)會(huì)。這往往會(huì)導(dǎo)致程序在Linux環(huán)境下異常。因此,跨平臺(tái)的代碼必須使用namespace來(lái)預(yù)防同名函數(shù)、變量和類(lèi)。我們推薦的命名原則是:namespace公司{namespace子系統(tǒng){namespace模塊{….C&C++跨平臺(tái)編碼教程(概論)源代碼文件WindowsVisualStudio工具對(duì)源代碼文件的結(jié)束符并無(wú)要求LinuxLinux編譯環(huán)境要求源代碼文件必須以換行符結(jié)束(文件末尾必須是換行符),否則在編譯時(shí)會(huì)提示warning。因此,我們要求跨平臺(tái)的代碼的文件末尾必須是換行符。C&C++跨平臺(tái)編碼教程(概論)資源文件WindowsVisualStudio為我們提供了資源文件的開(kāi)發(fā)、編輯工具和界面。LinuxLinux開(kāi)發(fā)工具并無(wú)資源一說(shuō)。因此,跨平臺(tái)的開(kāi)發(fā)必須將資源文件保存在能夠跨平臺(tái)的文件中,比如XML文件。在設(shè)計(jì)程序時(shí),必須設(shè)計(jì)資源的調(diào)用功能。C&C++跨平臺(tái)編碼教程(概論)編譯配置WindowsWindows下的工程編譯配置是在VisualStudio的工程屬性配置中就可以完成的。LinuxLinux的編譯參數(shù)只能在Makefile中進(jìn)行配置。Makefile使用的是腳本,不過(guò)我們可以使用Qt3或Qt4Creator來(lái)幫助我們編寫(xiě)Makefile腳本。做法就是用Qt創(chuàng)建一個(gè)C++工程,將工程的頭文件、源文件都添加到工程中去,然后使用qmake命令就可以自動(dòng)生成Makefile文件了。C&C++跨平臺(tái)編碼教程(概論)預(yù)編譯頭文件WindowsWindows下的工程編譯配置可以使用預(yù)編譯頭文件,而且VisualStudio創(chuàng)建的默認(rèn)工程通常都使用預(yù)編譯頭文件。Windows/Linux跨平臺(tái)的代碼不使用預(yù)編譯頭文件,因?yàn)長(zhǎng)inux下沒(méi)有預(yù)編譯頭文件的概念。全局的宏都在Makefile中就可以定義。Windows下的全局宏定義也可以在VisualStudio中實(shí)現(xiàn)。C&C++跨平臺(tái)編碼教程(概論)代碼移植基于ACESDK的代碼移植ACESDK中將操作系統(tǒng)相關(guān)的操作都封裝在ACE_OS命名空間相關(guān)的代碼中。因此,通過(guò)裁剪、修改這部分代碼,我們就可以將ACESDK移植到不同的操作系統(tǒng)上。ACESDK給我們的啟示在設(shè)計(jì)系統(tǒng)時(shí),我們也需要這樣,將那些與OS、外設(shè)相關(guān)的功能封裝成獨(dú)立的模塊,通過(guò)標(biāo)準(zhǔn)的接口調(diào)用。常見(jiàn)的這類(lèi)型的外設(shè)包括網(wǎng)絡(luò)傳輸、外設(shè)驅(qū)動(dòng)等。C&C++跨平臺(tái)編碼教程(概論)使用ACESDKACESDK是平臺(tái)相關(guān)的SDK,在使用之前必須要先編譯。在編譯過(guò)程中,ACESDK會(huì)檢查OS的配置來(lái)自動(dòng)完成兼容性宏設(shè)置。編譯完成后,我們需要將ACESDK的路徑添加到我們的開(kāi)發(fā)工具頭文件路徑和庫(kù)文件路徑中。在這些操作完成后,只要我們?cè)诠こ檀a中使用#include“ACE.h”,我們就可以使用ACESDK提供的類(lèi)庫(kù)和功能了。ACESDK的初始化操作ACE:init()和卸載操作ACE::fini()只需要在可執(zhí)行程序的初始化和卸載操作中添加,無(wú)需在動(dòng)態(tài)庫(kù)中添加。如果在動(dòng)態(tài)庫(kù)中使用,一旦動(dòng)態(tài)庫(kù)提前卸載,那么ACE環(huán)境就被異常卸載掉了。C&C++跨平臺(tái)編碼教程(概論)編程幫助文檔WindowsWindows中,MS提供了MSDN。在MSDN中,我們除了可以查閱MS專(zhuān)門(mén)提供的SDK幫助外,還能供查閱C/C++提供的SDK的資料。這是我們查閱資料的一個(gè)重要來(lái)源。LinuxLinux編程相關(guān)的資料比較分散,但我們可以通過(guò)如下途徑找到:百度搜索;O

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論