




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C/C++跨平臺編碼概論C&C++跨平臺編碼教程(概論)關(guān)于預(yù)編譯宏#pragmaWindowsWindows使用的#pragmaonce來防止頭文件重復(fù)引用Windows/Linux在跨平臺的代碼中,我們使用#ifndef…#define…#endif宏來實(shí)現(xiàn)這個(gè)功能C&C++跨平臺編碼教程(概論)#includeWindowsWindows中的#include中可以使用“\”,而且路徑名稱大小寫并無區(qū)別。例如下面的寫法是等效的:#include“..\\ACE.h”#include“../ACE.h”#include“..\\ace.h”Windows/Linux跨平臺的代碼中,#include中只能使用“/”(同網(wǎng)址中使用的相同),而且路徑名、文件名都是大小寫敏感的:#include“..\\ACE.h”(錯(cuò)誤)#include“ACE.h”與#include”ace.h”不等效C&C++跨平臺編碼教程(概論)開發(fā)工具WindowsWindows中我們通常都使用VisualStudio系列的開發(fā)工具來開發(fā)程序代碼Windows/Linux跨平臺的代碼也可以使用VisualStudio系列的開發(fā)工具來開發(fā),這與Windows程序一樣。不同的是我們并不使用MS提供的SDK(比如MFC),而是使用C++標(biāo)準(zhǔn)庫(VC已支持)和一些支出跨平臺的SDK(比如ACE)提供的庫C&C++跨平臺編碼教程(概論)字符串處理WindowsWindows中,我們使用CString來處理字符串。Windows/Linux跨平臺代碼中,我們使用C++標(biāo)準(zhǔn)庫的std::string來處理字符串,這個(gè)類對應(yīng)的頭文件是<string>。C++標(biāo)準(zhǔn)庫還提供了流操作來處理字符串,比如std::stringstream,這個(gè)類對應(yīng)的頭文件是<sstream>。C&C++跨平臺編碼教程(概論)多語言處理MVC原則MVC將系統(tǒng)分成了原始數(shù)據(jù)層,控制/映射層和視圖層。在這三個(gè)層次中,只有原始數(shù)據(jù)層和視圖層才可以處理多語言的問題,控制/映射層不應(yīng)該介入此問題。I/O處及時(shí)處理原則當(dāng)我們需要進(jìn)行字符集轉(zhuǎn)換時(shí),請?jiān)贗/O附近就完成這一功能。所謂的I/O附近是指跨越模塊、系統(tǒng)、文件讀寫操作等邊界的附近。這樣做可以讓模塊內(nèi)部、系統(tǒng)內(nèi)部的其它代碼免于字符串轉(zhuǎn)換的負(fù)擔(dān),簡化系統(tǒng)維護(hù)的難度和定位問題的難度。無論是否要跨平臺,在處理文字的時(shí)候,我們都會遇到多種字符集的問題。這里我們提供兩條原則來解決這一問題:C&C++跨平臺編碼教程(概論)基本變量類型WindowsWindows下,我們使用的是MS提供的一套變量類型,比如DWORD,WORD…Windows/Linux跨平臺方式下,我們使用的是支持跨平臺的SDK提供的變量類型。以ACESDK為例,我們使用的變量類型是ACE_UINT8,ACE_UINT32…C&C++跨平臺編碼教程(概論)指針32位系統(tǒng)在32位系統(tǒng)中,有時(shí)我們需要將指針轉(zhuǎn)換成整形變量。比如將指針用作map的key。如果我們要使用整形變量保存指針,使用int或long就行了。32位/64位系統(tǒng)在跨平臺時(shí),我們使用typedef來
解決這個(gè)問題。比如在基于ACESDK的開發(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++跨平臺編碼教程(概論)listWindowsWindows中,我們使用MS提供的CList類及其子類。Windows/Linux在跨平臺時(shí),我們使用的是C++標(biāo)準(zhǔn)庫提供的std::list類。C&C++跨平臺編碼教程(概論)mapWindowsWindows中我們使用MS提供的CMap類及其子類。其實(shí)MS的CMap類嚴(yán)格意義上說只能算是一個(gè)哈希表,算不上樹結(jié)構(gòu)。Windows/Linux在跨平臺時(shí),我們使用C++標(biāo)準(zhǔn)庫提供的std::map類。C&C++跨平臺編碼教程(概論)線程WindowsWindows中,MS提供了CWinThread和CThread兩個(gè)類來創(chuàng)建線程Windows/Linux在跨平臺時(shí),由于線程、互斥鎖、信號都是與OS相關(guān)的,所以我們只能使用支持跨平臺的SDK提供的類庫。比如在ACE中,我們可以使用ACE_Thread::spawn來創(chuàng)建線程。C&C++跨平臺編碼教程(概論)互斥鎖WindowsWindows中,MS提供了CCritialSection,CMutex等互斥鎖。Windows/Linux在跨平臺時(shí),由于線程、互斥鎖、信號都是與OS相關(guān)的,所以我們只能使用支持跨平臺的SDK提供的類庫。比如在ACE中,我們使用ACE_Thread_Mutex、ACE_Recursive_Thread_Mutex等互斥鎖。為了避免像MS中那樣忘了釋放互斥鎖,ACE還提供了ACE_GUARD宏來自動完成釋放操作。C&C++跨平臺編碼教程(概論)信號WindowsWindows中,MS提供CreateEvent函數(shù)來創(chuàng)建信號,WaitForSingleObject等函數(shù)來使用信號。Windows/Linux在跨平臺時(shí),由于線程、互斥鎖、信號都是與OS相關(guān)的,所以我們只能使用支持跨平臺的SDK提供的類庫。比如在ACE中,我們使用ACE_Auto_Event和ACE_Manual_Event來實(shí)現(xiàn)這些功能。C&C++跨平臺編碼教程(概論)動態(tài)分配內(nèi)存WindowsWindows中,我們使用new/delete或者malloc/realloc/free來動態(tài)分配、釋放內(nèi)存。其中,無論是new一個(gè)數(shù)組還是一個(gè)變量,我們都可以使用delete來釋放內(nèi)存Windows/Linux在跨平臺中,我們也是使用new/delete或者malloc/realloc/free來動態(tài)分配、釋放內(nèi)存。不過,與Windows不同,new一個(gè)數(shù)組必須使用delete[]來釋放,new一個(gè)變量必須使用delete來釋放。否則在Linux中會導(dǎo)致堆棧異常。C&C++跨平臺編碼教程(概論)字節(jié)對齊WindowsWindows中我們使用#pragmapack宏來聲明字節(jié)對齊的方式。LinuxLinux中我們使用__attribute__((aligned(n)))和__attribute__((packed))來聲明字節(jié)對齊的方式。我們通過宏定義+WIN32宏來實(shí)現(xiàn)代碼跨平臺:#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++跨平臺編碼教程(概論)namespaceWindowsWindows內(nèi)核與Linux不同,同名的兩個(gè)類我們可以封裝在不同的動態(tài)庫中,通過動態(tài)加載就可以同時(shí)使用了。LinuxLinux中,同名的兩個(gè)類即使封裝在兩個(gè)不同的動態(tài)庫中,內(nèi)核也會認(rèn)為是同一個(gè)類。只要任何一個(gè)類被內(nèi)核加載了,另一個(gè)同名類便再無機(jī)會。這往往會導(dǎo)致程序在Linux環(huán)境下異常。因此,跨平臺的代碼必須使用namespace來預(yù)防同名函數(shù)、變量和類。我們推薦的命名原則是:namespace公司{namespace子系統(tǒng){namespace模塊{….C&C++跨平臺編碼教程(概論)源代碼文件WindowsVisualStudio工具對源代碼文件的結(jié)束符并無要求LinuxLinux編譯環(huán)境要求源代碼文件必須以換行符結(jié)束(文件末尾必須是換行符),否則在編譯時(shí)會提示warning。因此,我們要求跨平臺的代碼的文件末尾必須是換行符。C&C++跨平臺編碼教程(概論)資源文件WindowsVisualStudio為我們提供了資源文件的開發(fā)、編輯工具和界面。LinuxLinux開發(fā)工具并無資源一說。因此,跨平臺的開發(fā)必須將資源文件保存在能夠跨平臺的文件中,比如XML文件。在設(shè)計(jì)程序時(shí),必須設(shè)計(jì)資源的調(diào)用功能。C&C++跨平臺編碼教程(概論)編譯配置WindowsWindows下的工程編譯配置是在VisualStudio的工程屬性配置中就可以完成的。LinuxLinux的編譯參數(shù)只能在Makefile中進(jìn)行配置。Makefile使用的是腳本,不過我們可以使用Qt3或Qt4Creator來幫助我們編寫Makefile腳本。做法就是用Qt創(chuàng)建一個(gè)C++工程,將工程的頭文件、源文件都添加到工程中去,然后使用qmake命令就可以自動生成Makefile文件了。C&C++跨平臺編碼教程(概論)預(yù)編譯頭文件WindowsWindows下的工程編譯配置可以使用預(yù)編譯頭文件,而且VisualStudio創(chuàng)建的默認(rèn)工程通常都使用預(yù)編譯頭文件。Windows/Linux跨平臺的代碼不使用預(yù)編譯頭文件,因?yàn)長inux下沒有預(yù)編譯頭文件的概念。全局的宏都在Makefile中就可以定義。Windows下的全局宏定義也可以在VisualStudio中實(shí)現(xiàn)。C&C++跨平臺編碼教程(概論)代碼移植基于ACESDK的代碼移植ACESDK中將操作系統(tǒng)相關(guān)的操作都封裝在ACE_OS命名空間相關(guān)的代碼中。因此,通過裁剪、修改這部分代碼,我們就可以將ACESDK移植到不同的操作系統(tǒng)上。ACESDK給我們的啟示在設(shè)計(jì)系統(tǒng)時(shí),我們也需要這樣,將那些與OS、外設(shè)相關(guān)的功能封裝成獨(dú)立的模塊,通過標(biāo)準(zhǔn)的接口調(diào)用。常見的這類型的外設(shè)包括網(wǎng)絡(luò)傳輸、外設(shè)驅(qū)動等。C&C++跨平臺編碼教程(概論)使用ACESDKACESDK是平臺相關(guān)的SDK,在使用之前必須要先編譯。在編譯過程中,ACESDK會檢查OS的配置來自動完成兼容性宏設(shè)置。編譯完成后,我們需要將ACESDK的路徑添加到我們的開發(fā)工具頭文件路徑和庫文件路徑中。在這些操作完成后,只要我們在工程代碼中使用#include“ACE.h”,我們就可以使用ACESDK提供的類庫和功能了。ACESDK的初始化操作ACE:init()和卸載操作ACE::fini()只需要在可執(zhí)行程序的初始化和卸載操作中添加,無需在動態(tài)庫中添加。如果在動態(tài)庫中使用,一旦動態(tài)庫提前卸載,那么ACE環(huán)境就被異常卸載掉了。C&C++跨平臺編碼教程(概論)編程幫助文檔WindowsWindows中,MS提供了MSDN。在MSDN中,我們除了可以查閱MS專門提供的SDK幫助外,還能供查閱C/C++提供的SDK的資料。這是我們查閱資料的一個(gè)重要來源。LinuxLinux編程相關(guān)的資料比較分散,但我們可以通過如下途徑找到:百度搜索;O
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 乙方商鋪?zhàn)赓U合同范本
- 出讓合同范本官網(wǎng)
- 個(gè)人催債合同范本
- 2025年遵義a2貨運(yùn)從業(yè)資格證考試
- 借款合同和抵押合同范例
- 勞務(wù)合同范本保密條款
- 東營市勞動合同范本
- 低成本創(chuàng)業(yè)合同范本
- 個(gè)人室內(nèi)植物租賃合同范本
- 棄土場土方外運(yùn)施工方案
- 《大模型原理與技術(shù)》全套教學(xué)課件
- 2024年青海省中考生物地理合卷試題(含答案解析)
- 2019譯林版高中英語全七冊單詞總表
- 2024年中鐵集裝箱運(yùn)輸有限責(zé)任公司招聘筆試參考題庫附帶答案詳解
- 蘇少版小學(xué)一年級下冊綜合實(shí)踐活動單元備課
- 《園林生態(tài)學(xué)》課件
- 人教版三年級數(shù)學(xué)下冊 (認(rèn)識東北、西北、東南、西南)位置與方向教育教學(xué)課件
- 《藥劑學(xué)》-阿昔洛韋軟膏的制備
- 畢業(yè)設(shè)計(jì)-膽囊結(jié)石患者的護(hù)理計(jì)劃
- 倒排工期計(jì)劃表
- 項(xiàng)目承包制實(shí)施方案
評論
0/150
提交評論