跨平台C、C++代碼注意的事項,代碼注意事項

來源:互聯網
上載者:User

跨平台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++開發上還需要做更多的探索。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.