C 跨平台開發心得小結

2021-09-02 03:47:42 字數 4129 閱讀 6850

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) 

如果在write之前主動檢查一下c2的長度再申請c1的空間當然是最好的。

4. 在linux下並不存在std::exception(char*),可以使用logic_error型別代替exception

5. 盡量使用stl與標準c庫,並且要按照標準c++語法來寫程式

比如這種用法list< type1>::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 _***xx_h_

# define _***xx_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

17. 對於介面操作部分**,一定要把它與程式邏輯核心**用巨集分開來,這樣的**才好移植,不要交錯

18. 不要假定可執行檔案一定有如.exe的副檔名

19. 在父類中用typedef定義的型別,在子類並不能直接使用

20. long型別的變數在32位和64位windows上都是4個位元組,而在64位linux系統上佔8位元組。

另附:linux網路程式設計常用標頭檔案:

sys/types.h:資料型別定義

sys/socket.h:提供socket函式及資料結構

netinet/in.h:定義資料結構sockaddr_in

netdb.h:提供設定及獲取網域名稱的函式

sys/ioctl.h:提供對i/o控制的函式

sys/poll.h:提供socket等待測試機制的函式

其他在網路程式中常見的標頭檔案

unistd.h:提供通用的檔案、目錄、程式及程序操作的函式

errno.h:提供錯誤號errno的定義,用於錯誤處理

fcntl.h:提供對檔案控制的函式

time.h:提供有關時間的函式

crypt.h:提供使用des加密演算法的加密函式

pwd.h:提供對/etc/passwd檔案訪問的函式

shadow.h:提供對/etc/shadow檔案訪問的函式

pthread.h:提供多執行緒操作的函式

signal.h:提供對訊號操作的函式

sys/wait.h、sys/ipc.h、sys/shm.h:提供程序等待、程序間通訊(ipc)及共享記憶體的函式

在編寫網路程式時,可以直接使用下面這段標頭檔案**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

涉及到使用者許可權及密碼驗證問題時加入如下語句:

#include

#include

#include

需要注意的是,應該在編譯時鏈結加密演算法庫,即增加編譯選項:

-lcrypt

涉及到檔案及時間操作加入如下語句: 

#include

#include

#include

#include

#include

涉及到多程序操作時加入如下語句: 

#include

#include

#include

#include

涉及到多執行緒操作時加入如下語句: 

#include

#include

需要注意的是,應該在編譯時鏈結執行緒庫,即增加編譯選項:-lthread

原文**:

C 跨平台開發心得小結

linux程式設計與windows程式設計的差異之處 1.檔案與目錄的大小寫以及路徑分隔符的差別 windows下不區分大小寫,路徑分隔符一般使用 linux下區分大小寫,路徑分隔符使用 2.itoa 函式在linux下並不存在 所以使用類似sprintf 之類的函式是個不錯的替代。為什麼說是類似函...

C 跨平台開發心得小結

linux程式設計與windows程式設計的差異之處 1.檔案與目錄的大小寫以及路徑分隔符的差別 windows下不區分大小寫,路徑分隔符一般使用 linux下區分大小寫,路徑分隔符使用 2.itoa 函式在linux下並不存在 所以使用類似sprintf 之類的函式是個不錯的替代。為什麼說是類似函...

跨平台C 程式開發經驗小結

這些是一些自己在開發過程中與移植程式過程中碰到的linux程式設計與windows程式設計的差異之處,以及從網上總結了一些解決辦法和經驗。1.檔案與目錄的大小寫以及路徑分隔符的差別。windows下不區分大小寫,路徑分隔符一般使用 linux下區分大小寫,路徑分隔符使用 2.itoa 函式在linu...