2013-04-09 66 views
6

Tôi đang cố gắng viết mã đa nền tảng trong C++ cho Windows (MinGW) và Linux (g ++). Tôi đã được sử dụng để xác định số nguyên 64 bit trong Linux là "dài", nhưng khi tôi chuyển đến MinGW, sizeof (dài) trả về 4 byte. Sau đó, tôi phát hiện ra rằng tôi có thể sử dụng "dài" hoặc "__INT64" để xác định số nguyên 64 bit trong MinGW. Tôi có hai câu hỏi:Định nghĩa nền tảng chéo của số nguyên 64 bit trong C++ cho Windows và Linux

1.-Cách di động nhất để xác định số nguyên 64 bit cho cả Windows và Linux là gì? Tôi hiện đang sử dụng #ifdef, nhưng tôi không biết nếu điều này là cách tốt nhất để làm điều đó:

#ifdef LINUX 
    #define INT64 long 
#elif WIN32 
    #define INT64 long long 
#endif 

2.- Tôi có nên sử dụng "dài dài" hoặc "__int64" trong MinGW? và tại sao?

+2

Tôi mỏng bạn muốn nói 'long long' không phải 'double double' – drahnr

+0

@drahnr xấu của tôi, tôi đã chỉnh sửa bài đăng –

Trả lời

11

Bạn có thể sử dụng loại int64_t, được xác định trong tiêu đề cstdint. Đây là tiêu chuẩn như của C++ 11.

Lưu ý rằng loại này có thể không tồn tại nếu nền tảng bạn đang sử dụng không hỗ trợ số nguyên 64 bit.

Đối với long long, đó là một khả năng khác. long long s có chiều rộng tối thiểu 64 bit. Lưu ý rằng nó là tiêu chuẩn như của C++ 11 là tốt, mặc dù nó sẽ làm việc trên một số trình biên dịch khi sử dụng C++ 03.

Như đã đề cập bởi Pete Becker, bạn có thể sử dụng int_least64_t. Đây là một lựa chọn tốt nếu bạn không nhớ sử dụng chính xác 64 bit số nguyên, nhưng một số loại tích phân là ít nhất là 64 bit.

+2

Có thể lựa chọn tốt hơn:' int_least64_t', sẽ luôn tồn tại. –

+0

@PeteBecker đẹp, cảm ơn. – mfontanini

+0

Bạn không hiểu: typedefs kích thước chính xác là tùy chọn, do đó, nó là xách tay hơn để sử dụng các loại ít nhất và nhanh chóng nếu bạn không cần số bit chính xác. – rubenvb

2

Tôi tin rằng câu hỏi cách lấy số nguyên 64 bit được trả lời đầy đủ, nhưng tôi sẽ chụp ở số nguyên thứ hai, cho dù sử dụng "dài" hay "__INT64". Câu hỏi bạn cần trả lời đầu tiên là những gì bạn cần. Nếu bạn cần chính xác 64 bit vì lý do nào đó, bằng mọi cách, hãy sử dụng thứ gì đó cung cấp cho bạn chính xác 64 bit đó, tức là int64_t. Ngay cả khi nền tảng/trình biên dịch của bạn không có stdint.h, hãy tạo typedef của bạn như một kiểu phù hợp như cách giải quyết (# ifdef'd cho trình biên dịch), vì nó làm cho mã của bạn tự tài liệu hơn. Mặt khác, nếu bạn đang xử lý ví dụ: các khoảng trống trong các phân đoạn bộ nhớ lớn (ví dụ như một hình ảnh DVD), sử dụng size_t hoặc ssize_t, bởi vì chúng thường có cùng kích thước với con trỏ, cũng là tự tạo tài liệu. Tương tự, bù đắp trong một tệp được biểu diễn tốt nhất bằng cách sử dụng fpos_t.

BTW: Giả định rằng "dài" là 64 bit trong Linux là sai. Cụ thể là trên các biến thể 32 bit, nó là không phải là 64 bit và tôi cũng không chắc chắn liệu tất cả các biến thể 64 bit có sử dụng thời lượng 64 bit hay không. Các hệ thống khác nhau này được gọi là ILP32, LP64 và LLP64. Tìm kiếm các cụm từ đó trên web!

+0

Bạn đang đúng về giả định rằng dài 64 bit trong Linux, tôi nên cẩn thận hơn với từ ngữ của mình. Cảm ơn câu trả lời. –