跨平台C、C++代碼注意的事項,代碼注意事項
在我們的開發中,跨平台的需求越來越強烈,如何保持C/C++代碼能在多個平台上編譯,是一個比較值得研究的問題。關於跨平台的文章網上很多,跨平台的庫網上也很多。那麼我從自己的跨平台開發經驗談一談自己的心得,希望對大家能夠起到一定的作用。主要涉及到Windows和linux兩個作業系統。
1、 關於路徑和標頭檔路徑分隔字元的問題
在Windows中,正斜杠和反斜線都可以,但是在Linux中,只能是/。
在Windows中,路徑大小寫無所謂,在Linux中嚴格區分大小寫。
2、 char的問題
如果考慮跨平台,需要明確指定是signed或者unsigned,因為不同平台直接聲明char,會導致signed或者unsigned的不確定性。
3、 關於寬字元的問題。
在Windows中,wchar_t佔兩個位元組,Linux中佔四個位元組,但是在Linux可以指定兩個位元組,這樣也會造成一個問題,就是某些第三方庫中wchar_t可能只指定四個位元組的,這樣就會導致不相容。
4、 Linux裡面沒有stricmp函數,在Linux下面是strcasecmp函數比較字串。
5、 與平台相關的調用盡量用宏隔離開來,一般用不同的目錄代表不同平台,BOOST、OGRE等是這樣做,也可以再一個類或者檔案中,這樣會導致到處都是作業系統和編譯器相關宏的定義。
6、 關於標頭檔包含
在Windows下某些C標準庫的標頭檔不用顯式包含,但是在linux下需要顯式包含。所以在.c和.cpp檔案中盡量包含這個檔案中需要的標頭檔。
7、 注意機器大尾端和小尾端的區別
大小尾端對檔案的讀寫會有很大影響,要編寫跨平台c++程式,大小尾端是必須要考慮的問題。比如,你在大尾端機器上寫了一個檔案,然後在小尾端機器上讀取,那麼結果肯定是錯誤的,所以,我們設計檔案格式時,都需要規定檔案是大尾端儲存還是小尾端儲存,或者一個檔案中規定某些部分是大尾端某些部分是小尾端。
8、 盡量只使用STL較早出現的函數或類
較早出現的東西相對來說比較穩定,STL的各個實現基本上都會有實現,這樣跨平台的時候可以相容多個平台。
9、 使用std::exception時需要注意,LINUX下是不支援拋出異常的,如果繼承自標準庫的異常類寫自己的異常類的時候,在Linux下,子類的解構函式中就需要表明不拋出異常,所以解構函式後面加上throw()就可以了。
10、當繼承模板類時。需要謹慎
在自己的代碼中,需要繼承模板類時,如果需要訪問基類模板類的成員函數或者成員變數,前面加上this->。另外,建構函式需要用到基類進行構造時。基類的類型需要需要用該類的型別參數初始化,否則在linux下會提示找不到基類的這個名字。
11、盡量使用標準C和C++的函數以及STL,使用C語言中定義的類型。
12、標頭檔重複包含的問題
盡量用保衛宏去實現防止標頭檔的重複包含,很多代碼在Windows下直接用#pragma once,這不能保證跨平台需要。
13、關於結構體對齊的問題。
CPU為了簡化記憶體和CPU之間的處理以及加快CPU從記憶體中取資料的速度,往往都會做一定的對齊,即結構體的各個成員並不是緊湊儲存的,往往在成員中間填充一些位元組。所以,我們一般不推薦用結構體直接讀取和寫入資料,這樣在不同系統或者電腦之間進行移植時,會出現錯誤的結果。
其實,這些只是冰山一角,在跨平台C/C++開發上還需要做更多的探索。