c++跨平臺開發經驗
1. 檔案與目錄的大小寫以及路徑分隔符的差別。
windows下不區分大小寫,路徑分隔符一般使用"\";linux下區分大小寫,路徑分隔符使用"/"。
2. itoa()函式在linux下並不存在。
所以使用類似sprintf();之類的函式是個不錯的替代。(為什麼說是類似函式,看下面一條啦)
3. _snprintf()與_vsnprintf()的差別。
sprintf()不能檢查目標字串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf()。
int _snprintf(
char *buffer,
size_t count,
const char *format [,
argument] ...
);
例如,要把c2字元產write給c1,比較安全的用法:
char c1[256];
sa[sizeof(c1)-1] = 0;
_snprintf(c1, sizeof(c1), "%s", c2);
if(c1[sizeof(c1)-1]!=0)
{
cout<<"warning: string is truncated")<<endl;
c1[sizeof(c1)-1]=0;
}
如果在write之前主動檢查一下c2的長度再申請c1的空間當然是最好的。
4. 在linux下並不存在std::exception(char*),可以使用logic_error型別代替exception。
5. 儘量使用STL與標準C庫,並且要按照標準C++語法來寫程式。
比如這種用法list< type1<T0> >::iterator iter;在windows下的編譯器下沒有編譯錯誤;但在linux下,就需要在前面增加typename才能順利編譯通過。
6. 在原始檔最後多加一個或幾行的空行,以免蹦出警告:"no newline at end of file"。
7. windows中對ini檔案進行操作的所有函式在linux下都沒有對應函式。
建議自己寫一個操作ini檔案的類,在STLChina上有一個使用stl製作這種類的原理介紹和一小段程式碼片段,自己擴充一下。
8. SOCKET物件集要使用fd_set,不要使用FD_SET。
9. stricmp()函式,在linux下用strcasecmp()函式替換。
10. 在linux下不存在INVALID_SOCKET、INVALID_HANDLE_VALUE、SOCKET_ERROR、MAX_PATH、INFINITE、STILL_ACTIVE等巨集定義。
11. 引數要求為char*的時候別忘了給傳進去的string加一個.c_str()函式。
12. linux下不存在目錄操作時要包含的direct.h與io.h標頭檔案,而要包含相應的unistd.h與fcntl.h標頭檔案。
13. filelength()函式在linux也不存在,可以通過fstat()函式來替代。
使用檔案與目錄操作函式,不要使用類似_access帶下劃線的函式,取而代之有access函式可以通用。
14. #prgram once預編譯指令在linux下並不起作用,請使用以下標準方式來解決標頭檔案多次包含問題:
#ifndef _XXXXX_H_
#define _XXXXX_H_
#endif
15. hash_map出現在後期版本的stl庫,為兼顧hasp與tree map,請可以通過以下巨集來解決:
// process hash_map
#if defined(_MSC_VER)
#if _MSC_VER >= 1300
// hasp_map not standard container
#pragma warning(disable: 4996)
#include <hash_map>
// we believe _STLP_STRING included means using STLPORT
#elif defined(_STLP_STRING)
#include <hash_map>
#else
#define hash_map map
#endif
#endif
16. 為了區別不同OS,一般可用的幾個巨集有:WIN32,__linux__,需要使用與OS相關的內容,請一定用開關來寫。
17. 對於介面操作部分程式碼,一定要把它與程式邏輯核心程式碼用巨集分開來,這樣的程式碼才好移植,不要交錯。
18. 不要假定可執行檔案一定有如.exe的副檔名。
19. 在父類中用typedef定義的型別,在子類並不能直接使用。
20. long型別的變數在32位和64位Windows上都是4個位元組,而在64位Linux系統上佔8位元組。
相關文章
- Dropbox經驗談:iOS和Android的C++跨平臺開發iOSAndroidC++
- 跨平臺開發Flutter初體驗Flutter
- 使用c++開發跨平臺的程式C++
- 跨平臺開發之React Native初體驗React Native
- 跨平臺開發框架的大旗框架
- 跨平臺開發框架 Lynx 初探框架
- QT6跨平臺開發QT
- Flutter實現Android、iOS跨平臺經驗總結FlutterAndroidiOS
- 00-跨平臺開發之FlutterFlutter
- APP跨平臺開發技術分析APP
- 移動跨平臺開發深度解析
- 跨平臺開發技術簡介!
- hybird跨平臺移動app開發APP
- Dart Editor——跨平臺的開發工具Dart
- 後臺開發面試經驗面試
- 直播平臺開發經驗分享——直播平臺搭建環境配置詳解及分析
- 跨平臺的C/C++整合開發環境 CLion 2022C++開發環境
- MediaPipe - 跨平臺機器學習應用開發框架API機器學習框架
- 跨平臺開發時代的 (再次) 到來?
- 使用 Vagrant 打造跨平臺開發環境開發環境
- 邁步進入跨平臺開發時代
- 使用wxdindows開發跨平臺的介面(轉)
- 騰訊後臺開發面試經驗面試
- 列一份跨平臺開發的讀書清單[C/C++ (or Java?)]C++Java
- flutter跨平臺開發之App升級方案FlutterAPP
- 移動端跨平臺開發的深度解析
- 小程式跨平臺開發解決方案探索
- 跨平臺開發,各種巨集的定義
- 跨平臺 App 開發引擎 CrossApp 亮相 GMGDCAPPROS
- 推薦幾款App跨平臺開發工具APP
- MobileLab跨平臺開發專題交流會
- 如何有效開發一款跨平臺遊戲遊戲
- 跨平臺介面開發除了QT還有啥QT
- asp net core 跨平臺初體驗
- 使用VSCode和CMake構建跨平臺的C/C++開發環境VSCodeC++開發環境
- 一套跨平臺五子棋網遊的開發經歷
- Visual Studio 2015 移動跨平臺開發初體驗
- 微軟借力.NET開源跨平臺支援,佈局物聯網平臺開發微軟