2010-08-17 33 views
5

Tôi hiện đang di chuyển từ Visual Studio 2008 sang 2010. Phần mềm của tôi sử dụng nhiều tính năng Boost và TR1. Bây giờ tôi nhận được rất nhiều lỗi biên dịch, vì VC10 có thực thi TR1 riêng của nó.TR1 từ Boost hoặc VC10 - Cái nào tốt hơn?

Tôi biết tôi có thể tắt triển khai TR1 của Microsoft với công tắc _HAS_CPP0X (xem here), nhưng tôi không chắc liệu điều này có vô hiệu hóa các tính năng khác có thể thú vị trong tương lai hay không.

Vì vậy, tôi tự hỏi đó là việc thực hiện tốt hơn TR1: một từ Boost hoặc một từ Microsoft? Có bất kỳ sự khác biệt nào không? Việc vô hiệu hóa việc triển khai Microsoft có bất kỳ bất lợi nào không?

+0

Không phải đây là câu trả lời bạn đang tìm kiếm ... Nếu bạn tắt Microsoft tr1, bạn không thể biên dịch mà không tăng cường. Nếu bạn sử dụng boost, bạn có thể yên tâm rằng bạn sẽ có một đường dẫn nâng cấp ổn định và mã của bạn sẽ biên dịch bên ngoài MSVC. Điều đó, và tăng cường có nhiều tính năng hơn so với chỉ những cái trong TR1 :) –

+0

Lỗi chính xác, định nghĩa trùng lặp là gì? – MSalters

+0

Có, lỗi chính xác là định nghĩa trùng lặp. Nó cũng có một cái gì đó để làm với ADL.Nếu tôi đủ điều kiện mỗi lần xảy ra ràng buộc hoặc _1 (std :: bind và std :: tr1 :: placeholders :: _ 1) mã sẽ sớm trở nên rất khó chịu :) –

Trả lời

1

Nếu mã của bạn không biên dịch với thư viện chuẩn của VC10, thì điều đó có thể cho biết rằng nó không phù hợp với tiêu chuẩn. Thư viện chuẩn trong VC10 đến từ Dinkumware, và những kẻ này không tệ khi nói đến việc triển khai một thư viện chuẩn. (PJP từng là chủ tịch nhóm làm việc của lib.) Tôi sẽ xem xét kỹ lưỡng từng vấn đề, trước khi bác bỏ nó như một vấn đề cụ thể cho VC, vì sợ rằng bạn có thể không tương thích trong tương lai.

Ngoài ra, TTBOMK, VC10 không chỉ đi kèm với TR1, nhưng với C++ 1x (ví dụ: std::shared_ptr thay vì std::tr1::shared_ptr; ICBWT), vì vậy thư viện của boost và VC10 thực sự không thể so sánh được.

+0

Bạn đã kiểm tra việc triển khai danh sách chưa? Tôi đã không nhìn một trong những đi kèm với vs2010, nhưng trước đó tất cả đã có sự phức tạp tuyến tính cho nối. – leiz

+1

@leiz: Không, tôi không có. (Tôi hiếm khi kết thúc bằng cách sử dụng một danh sách, ngay cả khi tôi bắt đầu làm như vậy. Thông thường, vector trở nên tốt hơn.) Nhưng tôi đã nói rằng, khi mã thậm chí không _compile_ sử dụng nó, tôi sẽ xem xét thật kỹ trước khi loại bỏ đây là một vấn đề với việc thực hiện thư viện, chứ không phải là một vấn đề với mã, bởi vì, _generally_, việc triển khai của chúng khá tốt. Điều đó không có nghĩa là, tuy nhiên, tôi nghĩ rằng có _no vấn đề ở all_ trong Dinkumware thực hiện. Dinkumware được điều hành bởi con người. – sbi

+0

@leiz: C++ 0x bây giờ xác định rằng 'splice' phải là O (1) và cho phép' size' là O (n) cho danh sách (vì hai không tương thích), tôi không biết có hay không là trường hợp của C++ 03. –

0

Đầu tiên:
Bạn sẽ có thể sử dụng Boost và TR1 cạnh nhau. Nếu tất cả mọi thứ được cấu hình đúng và bạn không rối tung xung quanh với using namespace bạn sẽ không nhận được bất kỳ lỗi nào.

C++ 11 cung cấp các tính năng như các auto từ khóa (more info) hoặc khởi tạo của lớp thuộc tính trong khai của họ (more info) mà Boost không thể cung cấp.

Ở phía bên kia Boost cung cấp nhiều hơn là chỉ triển khai tính năng C++ 11 của chúng. Về cơ bản Boost là một bộ sưu tập các thư viện được coi là được thêm vào tiêu chuẩn C++.

Khi nói đến tính năng mà cả hai cung cấp (như shared_ptr) Tôi sẽ khuyên bạn sử dụng Boost:

  • Boost biên dịch với trình biên dịch mà không hỗ trợ một số tính năng C++ 11
  • Bạn có một sự phụ thuộc rõ ràng thay vì chỉ chuyển tiếp trên C++ 11 (hầu hết các trình biên dịch thực hiện khác nhau)
  • Các kiểu dữ liệu tăng cường (ví dụ shared_ptr) tương thích với các tính năng Boost khác như serialization.

Đề nghị của tôi là sử dụng C++ 11 chỉ nếu bạn hoàn toàn cần nó và tăng cường trong mọi trường hợp khác.

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