跨平臺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從內存中取數據的速度。往往都會做一定的對齊,即結構體的各個成員並非緊湊存儲的,往往在成員中間填充一些字節。所以,我們一般不推薦用結構體直接讀取和寫入數據,這樣在不同系統或者計算機之間進行移植時,會出現錯誤的結果。
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++開發上還須要做很多其它的探索。

 

https://www.cnblogs.com/tlnshuju/p/7071371.html

發佈了4 篇原創文章 · 獲贊 167 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章