2011-08-17 38 views
9

Đối với mã tôi hiện đang làm việc, đôi khi chúng ta cần biên dịch trên một số hệ thống cũ hơn với các trình biên dịch cũ hơn (ví dụ: chúng tôi chạy các sim trên một phiên bản cũ hơn của IBM BlueGene/L, là hợp đồng hỗ trợ đưa ra một số trình biên dịch C++ cũ). Bản thân mã này sử dụng shared_ptrs, và ban đầu được viết để sử dụng std :: tr1 :: shared_ptr. Khi biên dịch trên máy BlueGene cũ, tôi nhanh chóng nhận ra rằng nó không có một tr1 :: thực hiện, và vì vậy tôi chuyển sang tăng :: shared_ptr. Hóa ra đó cũng là một tăng :: tr1 :: shared_ptr. Bây giờ mã đang được sử dụng rộng rãi hơn bên ngoài nhóm nghiên cứu của chúng tôi, tính di động đang trở nên quan trọng hơn.Làm thế nào để xử lý phát triển C++ std :: namespace? ví dụ: std :: tr1 :: shared_ptr so với std :: shared_ptr so với boost :: shared_ptr vs. boost :: tr1 :: shared_ptr

Thực hành tốt nhất (?) Là gì để xử lý các loại vấn đề thư viện chuẩn đang phát triển này trong một codebase lớn-ish? Tôi giả định rằng trong tiêu chuẩn C++ 11 mới, shared_ptr sẽ không còn trong không gian tên tr1, mà thêm một tiềm năng khác: std :: shared_ptr, tuy nhiên tôi đoán hỗ trợ phổ biến cho điều này sẽ là một cách tắt. Tôi muốn sử dụng tiêu chuẩn mới nhất nếu có thể, nhưng cần phải duy trì tính di động. Tôi có nên gắn bó với tăng cường không?

+0

Có đã được trình biên dịch mà 'std :: shared_ptr' có sẵn, như VC2010 và các phiên bản gần đây của g ++.Nếu bạn cần hỗ trợ vô số các trình biên dịch khác nhau, việc gắn bó với boost có lẽ là dễ nhất. :) – Sven

+0

Chỉ vì shared_ptr sẽ được thêm vào namespace std :: không có nghĩa là nó sẽ bị xóa * khỏi namespace std :: tr1 ::. Tôi biết rằng gcc/libstdC++ sẽ duy trì cả về sau. Trong thực tế, tôi chắc rằng studio hình ảnh sẽ giống nhau. – emsr

+0

Tôi nghĩ rằng nếu bạn nhìn xung quanh, hỗ trợ cho std :: shared_ptr là rất rộng trên hầu hết các trình biên dịch trong hai năm qua ít nhất. Tôi sẽ dính với std :: đầu tiên, sau đó tìm std :: tr1 :: sau đó thử tăng theo thứ tự đó. – emsr

Trả lời

8

phần câu trả lời cho câu hỏi của bạn

boost::tr1 được phát minh một cách chính xác cho việc triển khai thư viện tiêu chuẩn mà không có một tr1. Để trích dẫn tài liệu từ here:

Thư viện TR1 cung cấp một thực hiện các báo cáo kỹ thuật C++ trên Tiêu chuẩn Thư viện Extensions. Thư viện này không tự thực hiện thành phần TR1, thay vào đó là một trình bao bọc mỏng sẽ bao gồm triển khai TR1 của thư viện chuẩn ( ) (nếu có), nếu không thì sẽ bao gồm Thư viện Boost tương đương và nhập chúng vào std không gian tên: : tr1

+0

Cảm ơn bạn rất nhiều cho tip- Tôi không có ý tưởng rằng tăng :: tr1 nhập khẩu vào std :: tr1. Có boost :: tr1 giờ đã có ý nghĩa hơn với tôi. Chúc mừng! – MarkD

1

Tại sao không có một số kiểm tra thời gian biên dịch đặc biệt? Loại:

#if __GNUC__ > 3 
    #define BOOST boost:: 
#else 
    #define BOOST boost::tr1:: 
#endif 

BOOST shared_ptr<...> ... 

Bạn có thể tra cứu trong thư viện tăng cường, chúng có nhiều mã trình biên dịch/phiên bản.

Xem this question để biết chi tiết về các macro, đặc biệt là liên kết này: http://predef.sourceforge.net/.

+0

Tôi làm tương tự ngoại trừ tôi sử dụng std :: tr1 và std :: thay thế. – emsr

+0

Tôi thực sự đã từng làm một việc như vậy vì đó là điều dễ nhất để làm. Khi nó bắt đầu rối hơn (một số trình biên dịch có thay đổi trong hỗ trợ TR1 trên các phiên bản nhỏ), tôi quyết định chỉ sử dụng 'std' trong mã thư viện và cho phép người dùng điều chỉnh môi trường của mình, anh ấy biết nó tốt hơn tôi. –

9

Để phát hiện không gian tên shared_ptr đang ở, bạn cần một cái gì đó như autoconf - đây là lý do tại sao autoconf được tạo (phát hiện biến thể nền tảng/trình biên dịch). Bạn có thể làm điều này với:

AC_LANG(C++) 

AC_MSG_CHECKING([for std::shared_ptr]) 
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
    [[#include <memory>]] 
    [[std::shared_ptr<int> have_shared_ptr;]]) 
], [ 
    AC_MSG_RESULT([yes]) 
    AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 1, [Define to 1 if you have the `std::shared_ptr' class.]) 
], [ 
    AC_MSG_RESULT([no]) 
    AC_DEFINE_UNQUOTED([HAVE_STD_SHARED_PTR], 0, [Define to 1 if you have the `std::shared_ptr' class.]) 
]) 

Lặp lại cho std::tr1::shared_ptr, boost::tr1::shared_ptrboost::shared_ptr.

Sau đó bạn có thể tạo một tập tin shared_ptr.hpp đó là một cái gì đó như:

#include <config.h> 

#if defined(HAVE_STD_SHARED_PTR) 
    namespace ptr = std; 
#elif defined(HAVE_STD_TR1_SHARED_PTR) 
    namespace ptr = std::tr1; 
#elif defined(HAVE_BOOST_SHARED_PTR) 
    namespace ptr = boost; 
#elif defined(HAVE_BOOST_TR1_SHARED_PTR) 
    namespace ptr = boost::tr1; 
#else 
# error No shared_ptr found. 
#endif 

... mà sau đó bạn có thể sử dụng như:

ptr::shared_ptr<int> pointer(new int(5)); 
+1

Nhận xét thứ hai của bạn trong ví dụ autoconf nên được đảo ngược – Attila

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