1. 程式人生 > >C++跨平臺開發心得小結

C++跨平臺開發心得小結

Linux程式設計與windows程式設計的差異之處:

     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] ; 
c1[ 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位元組。