2010-06-24 12 views
7

Tôi hiện đang chuyển một số mã cửa sổ và cố gắng làm cho nó có sẵn để sử dụng trong Ubuntu. Dự án ban đầu được biên soạn trong VC++ mà không có bất kỳ vấn đề nào. Ngoài ra tôi nên lưu ý rằng điều này chỉ cần làm việc trong Ubuntu, nhưng nhiều ý tưởng nền tảng độc lập hơn chắc chắn được chào đón.Mã cửa sổ chuyển mã, sử dụng gì thay vì __int64 _tmain và _TCHAR *?

Hầu hết mã đều dễ cổng vì nó chủ yếu là một dự án mô phỏng số với một vài phần hệ điều hành cụ thể. Không có UNICODE được sử dụng trong phiên bản được chuyển và không cần phải hỗ trợ điều này.

Tôi muốn biết những gì thực tiễn tốt nhất được khi cố gắng để có được mã này để biên dịch với GCC, cụ thể:

gì được coi là sự thay thế tốt nhất cho: __int64, _tmain và _TCHAR *?

Cảm ơn!

Trả lời

12

Đối với phiên bản 64-bit:

#include <inttypes.h> 
typedef int64_t __int64; 

Đối với các vấn đề TCHAR. Tôi thực sự tìm thấy TCHARs khá hữu ích vì vậy tôi có một tập tin với tất cả các chức năng _t tôi sử dụng trong nó.

ví dụ

#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 

như đối với các chức năng cơ bản _s ... Tôi thực hiện chúng. Nó mất khoảng một giờ mã hóa để làm nhưng nó làm cho các dự án chuyển đến các nền tảng khác hoặc trình biên dịch IMMENSELY dễ dàng hơn.

+0

Điều này có vẻ như là một giải pháp thực sự tốt, cảm ơn! – shuttle87

0

Bạn có thể sử dụng qint64 từ khung công tác Qt (Nền tảng độc lập), nhưng có thể có những cách dễ dàng hơn.

2

GCC hỗ trợ long long (tùy thuộc vào cờ tổng hợp), số nguyên 64 bit. Hoặc bạn có thể sử dụng std::int64_t từ tiêu đề cstdint.

Hoặc để có nhiều nền tảng, sử dụng boost/cstdint.hpp, trong đó xác định boost::int64_t

_tmain chỉ là Microsoft là ngớ ngẩn (hoặc không chuẩn, nếu bạn sẽ) Phần còn lại của thế giới sử dụng main, đồng bằng và đơn giản. _TCHAR không có tương đương trực tiếp, nhưng vì bạn nói rằng bạn không cần phải hỗ trợ wchar_t, bạn chỉ có thể thay thế nó bằng số điện thoại char.

+3

Tại sao lại là downvote? – jalf

+1

Nó không thực sự ngớ ngẩn nhưng lịch sử. '_tmain()' là kết quả của quyết định của MS để đi với UCS-2 cho Unicode trở lại khi không có hệ điều hành chính nào hỗ trợ Unicode. UCS-2 dựa trên các đơn vị ký tự 16 bit nên 'main()' cần một "ký tự rộng"/Unicode counterpart và '_tmain()' đã được giải quyết thành 'main()' hoặc ký tự 16 bit dựa trên liệu một bản dựng Unicode có được biên dịch hay không. Sau đó trên các hệ điều hành khác đi kèm với phiên bản UTF-8 được dựa trên các đơn vị ký tự 8-bit, vì vậy 'main()' vẫn có thể được sử dụng và Windows đi từ UCS-2 sang UTF-16, vẫn dựa trên 16-bit đơn vị ký tự. – hippietrail