標籤:g++ 一個 data- 編寫 標頭檔路徑 char .cpp 原始碼 源檔案
在我們的開發中,跨平台的需求越來越強烈,怎樣保持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從記憶體中取資料的速度。往往都會做一定的對齊,即結構體的各個成員並非緊湊儲存的,往往在成員中間填充一些位元組。所以,我們一般不推薦用結構體直接讀取和寫入資料,這樣在不同系統或者電腦之間進行移植時,會出現錯誤的結果。
14、注意BOM的陷阱(位元組順序標記)
假設你在Windows用記事本建立一個源檔案。那麼Windows會在檔案最前面加上一個BOM標記。即所謂的位元組順序標記,這種原始碼在Windows下沒問題,可是在Linux下就編譯只是,所以須要用其它的文字編輯器或者直接在VS裡面建立源檔案。
Linux下gcc/g++不認帶BOM標記的源檔案。
15、注意調用函數時的形參類型和函式宣告中參數列表的類型不符。這裡特指有無const或者是否是引用參數。在Windows下的cl編譯器沒問題,linux下GCC/G++會報錯。
16、注意兩個角括弧不要連著寫。比如std::vector<std::vector<int>> vec;在Windows下這麼寫全然沒問題,那麼在linux下就是編譯只是,所以linux下能夠在連續兩個角括弧符號之間留一個空格,即std::vector<std::vector<int> > vec;
事實上。這些僅僅是冰山一角。在跨平台C/C++開發上還須要做很多其它的探索。
跨平台C、C++代碼注意的事項