2010-06-24 30 views
7

我目前正在移植一些Windows代碼,並試圖使它可用於Ubuntu中。該項目最初是用VC++編譯的,沒有任何問題。另外我應該注意的是,這隻需要在Ubuntu中工作,但更多平臺獨立的想法當然是受歡迎的。移植Windows代碼,使用什麼而不是__int64 _tmain和_TCHAR *?

大部分代碼很容易移植,因爲它大部分是一個數值模擬項目,只有很少的操作系統特定部分。在移植版本中沒有使用UNICODE,並且沒有任何需要支持這一點。

我想知道什麼是最好的做法,試圖讓這個代碼編譯與海灣合作委員會的時候,特別是:

什麼被認爲是最好的替代:__int64,_tmain和_TCHAR *?

謝謝!

回答

12

對於64位:

#include <inttypes.h> 
typedef int64_t __int64; 

至於TCHAR問題。實際上我發現TCHARs非常有用,所以我有一個包含我在其中使用的所有_t函數的文件。

e.g

#ifdef UNICODE 

#define _tcslen  wcslen 
#define _tcscpy  wcscpy 
#define _tcscpy_s wcscpy_s 
#define _tcsncpy wcsncpy 
#define _tcsncpy_s wcsncpy_s 
#define _tcscat  wcscat 
#define _tcscat_s wcscat_s 
#define _tcsupr  wcsupr 
#define _tcsupr_s wcsupr_s 
#define _tcslwr  wcslwr 
#define _tcslwr_s wcslwr_s 

#define _stprintf_s swprintf_s 
#define _stprintf swprintf 
#define _tprintf wprintf 

#define _vstprintf_s vswprintf_s 
#define _vstprintf  vswprintf 

#define _tscanf  wscanf 


#define TCHAR wchar_t 

#else 

#define _tcslen  strlen 
#define _tcscpy  strcpy 
#define _tcscpy_s strcpy_s 
#define _tcsncpy strncpy 
#define _tcsncpy_s strncpy_s 
#define _tcscat  strcat 
#define _tcscat_s strcat_s 
#define _tcsupr  strupr 
#define _tcsupr_s strupr_s 
#define _tcslwr  strlwr 
#define _tcslwr_s strlwr_s 

#define _stprintf_s sprintf_s 
#define _stprintf sprintf 
#define _tprintf printf 

#define _vstprintf_s vsprintf_s 
#define _vstprintf  vsprintf 

#define _tscanf  scanf 

#define TCHAR char 
#endif 

作爲_s功能基本...我實現了他們。它需要大約一個小時的編碼才能完成,但它使得將項目移植到其他平臺或編譯器變得更加簡單。

+0

這似乎是一個非常好的解決方案,謝謝! – shuttle87 2010-06-29 04:56:29

0

您可以使用Qt框架中的qint64(與平臺無關),但可能有更簡單的方法。

2

GCC支持long long(取決於編譯標誌),它是一個64整數的整數。或者,您可以使用cstdint標題中的std::int64_t

或更跨平臺,使用boost/cstdint.hpp,它定義boost::int64_t

_tmain只是微軟傻(或非標準的,如果你會)世界的其餘部分使用main,簡單明瞭。 _TCHAR沒有直接的等價物,但既然你說你不需要支持wchar_t,你可以用它代替char

+3

爲什麼downvote? – jalf 2010-06-24 13:45:56

+1

這不是真的很愚蠢,但歷史。 '_tmain()'是MS決定在沒有主要操作系統支持Unicode的情況下使用UCS-2返回Unicode的結果。 UCS-2基於16位字符單位,所以'main()'需要一個「寬字符」/ Unicode對應字符,而_tmain()被解析爲'main()'或16位字符等價字符。無論是編譯Unicode編譯還是不編譯。後來在其他操作系統上使用基於8位字符單位的UTF-8版本,所以仍然可以使用「main()」,Windows從UCS-2轉換爲UTF-16,而UTF-16仍然基於16位字符單位。 – hippietrail 2013-03-20 06:44:29

相關問題