2010-11-02 22 views
6

Có một thư viện mà tôi xây dựng dựa trên các nền tảng 32 bit khác nhau. Bây giờ, kiến ​​trúc 64-bit phải được hỗ trợ. Các chiến lược chung nhất để mở rộng mã 32 bit hiện có để hỗ trợ kiến ​​trúc 64 bit là gì? Tôi có nên sử dụng # ifdef hoặc bất kỳ thứ gì khác không?Thêm hỗ trợ 64 bit vào mã 32 bit hiện tại, có khó không?

Trả lời

16

Số lượng nỗ lực liên quan sẽ phụ thuộc hoàn toàn vào cách viết mã ban đầu. Trong trường hợp tốt nhất có thể sẽ không có nỗ lực nào khác ngoài việc biên dịch lại. Trong trường hợp xấu nhất, bạn sẽ phải mất rất nhiều thời gian làm cho mã của bạn "64 bit sạch".

vấn đề điển hình là:

  • giả định về kích thước của int/dài/con trỏ/etc
  • con trỏ gán < => ints
  • dựa vào đối số mặc định hoặc chuyển đổi kết quả chức năng (tức là không có nguyên mẫu hàm)
  • thông số định dạng printf/scanf không phù hợp
  • giả định về kích thước/căn chỉnh/đệm của cấu trúc (đặc biệt là đối với tệp hoặc mạng I/O) , Hoặc giao tiếp với các API khác, vv)
  • phôi không phù hợp khi thực hiện con trỏ số học với byte offset
+5

+1 Chỉ một số bổ sung: Trường hợp khó chịu cho đối số nguyên là hàm va_arg: tất cả các loại số nguyên hẹp tương ứng với '...' sẽ được chuyển thành 'int'. Sau đó, mã sử dụng số nguyên 'typeof' với ngữ nghĩa chính xác như 'size_t',' uintptr_t', 'ptrdiff_t',' uint64_t' sẽ thường chỉ biên dịch và chạy. Mã có sự lạm dụng cho 'int' ở khắp mọi nơi dưới dạng biến vòng lặp, làm số học' char' quên rằng điều này có thể được ký hoặc chưa ký, và những thứ như thế đang tìm kiếm sự cố. Chạy mã của bạn thông qua các trình biên dịch khác nhau với tất cả các cảnh báo, 'clang' là một bổ sung tốt cho' gcc' –

+0

@Jens: cảm ơn các nhận xét bổ sung - điểm về xây dựng và thử nghiệm với nhiều trình biên dịch là một điều rất tốt. –

1

Đơn giản chỉ cần không dựa vào giả định về kích thước từ máy? luôn sử dụng sizeof, stdint.h, v.v. Trừ khi bạn dựa vào các cuộc gọi thư viện khác nhau cho các kiến ​​trúc khác nhau, không cần phải có #ifdefs.

-1

Chiến lược đơn giản nhất là để xây dựng những gì bạn có với các thiết lập 64-bit và kiểm tra các heck ra khỏi nó. Một số mã không cần phải thay đổi chút nào. Mã khác, thường với các giả định sai về kích thước của int/con trỏ sẽ dễ vỡ hơn nhiều và sẽ cần được sửa đổi để không phụ thuộc vào kiến ​​trúc.

Các tệp nhị phân thường chứa bản ghi nhị phân gây ra nhiều sự cố nhất. Điều này đặc biệt đúng trong các môi trường mà ints tăng từ 32-bit lên 64-bit trong quá trình chuyển đổi sang bản dựng 64 bit. Chủ yếu điều này là do thực tế là các số nguyên được viết tự nhiên cho các tệp trong chiều dài hiện tại (32 bit) của chúng và đọc bằng cách sử dụng độ dài không chính xác trong bản dựng 64 bit trong đó int là 64 bit.

+1

Nó phụ thuộc vào trình biên dịch của khóa học, nhưng tất cả các trình biên dịch C 64 bit tôi đã sử dụng (gcc, clang), để 'int' ở 32 bit và tạo bit dài 64 bit. – JeremyP

+1

@JeremyP: Nó phụ thuộc vào mô hình dữ liệu nền tảng (http://en.wikipedia.org/wiki/64-bit#Specific_C-language_data_models) thay vì trình biên dịch. Ví dụ trên Win64 cả 'int' và' long' vẫn là 32 bit, trong khi 'long long' là 64 bit, vì vậy mô hình giống với Win32 cho số nguyên, nhưng con trỏ trở thành 64 bit, do đó mã cố gắng sử dụng' int' hoặc 'long' để giữ giá trị con trỏ sẽ không thành công - thay đổi thành' intptr_t' nếu cần. – Clifford

Các vấn đề liên quan