2012-02-28 28 views
7

Trong thư viện stlport, tôi thấy mã này:STLPORT: Không gian tên std {} có nghĩa là gì?

namespace std { } 
namespace __std_alias = std; 

1. họ đang cố gắng vô hiệu hóa những std namespace tiêu chuẩn trong dòng đầu tiên?
2. Tại sao trên thế giới, họ sẽ sử dụng tên bí danh dài hơn thay cho tên gốc?

+5

'không gian tên std {}' sẽ không hủy bỏ 'std', nó sẽ không thêm gì vào nó :) Và, tất nhiên, đưa tên vào phạm vi. –

+0

Ok do đó, nó chỉ để đưa nó vào phạm vi của tệp và nội dung của không gian tên vẫn giữ nguyên. Niềng răng '{}' chỉ có ở đó. Chúng không thêm bất cứ thứ gì vào không gian tên và cũng không lấy đi bất cứ thứ gì. Cảm ơn! – Nav

Trả lời

8

Bạn cần có không gian tên "trong phạm vi" trước khi bạn có thể khai báo bí danh cho nó. Số trống namespace std {} thông báo cho trình biên dịch rằng không gian tên tồn tại. Sau đó, họ có thể tạo bí danh cho nó.

Có nhiều lý do để tạo bí danh ngoài việc tạo lối tắt. Ví dụ, bạn có thể định nghĩa một macro để "đổi tên" vùng tên - xem xét hiệu quả của #define std STLPORT_std. Có một bí danh cho phép bạn truy cập vào không gian tên ban đầu miễn là bạn chơi đúng các trò chơi đặt hàng với các tệp tiêu đề.

3
  1. Không, điều đó chỉ đảm bảo tên của không gian tên khả dụng trong phạm vi hiện tại. Bạn có thể mở và đóng các không gian tên tại bất kỳ thời điểm nào, mà không ảnh hưởng đến nội dung của không gian tên.

  2. Tôi đoán, vì vậy, họ có thể dễ dàng thay đổi triển khai thư viện của mình thành không gian tên khác với ::std (bằng cách thay đổi __std_alias để đặt bí danh cho một thứ khác). Điều này sẽ hữu ích, ví dụ, nếu bạn muốn thử nghiệm hai triển khai cùng với nhau.

0

Ngoài những gì D.Shawley nói, về phía trước khai báo một lớp đó là bên trong một không gian tên đòi hỏi cùng một cú pháp:

namespace std 
{ 
    template <typename T> 
    class vector; 
} 
+0

chỉ có vấn đề với ví dụ của bạn là vector có tham số thứ 2, trình phân bổ, do đó, việc khai báo chuyển tiếp này có thể khiến bạn gặp rắc rối sau này. – CashCow

+0

Tôi đồng ý rằng véc tơ không phải là ví dụ tốt nhất, tôi chỉ muốn điều gì đó mà tất cả chúng ta đều biết và yêu thích :) –

2

Nó là khá gây phiền nhiễu để nhận được một lỗi biên dịch rằng không có như vậy không gian tên như std ... Trình biên dịch suy nghĩ là gì? Tất nhiên nó tồn tại!

Vâng vâng, nhưng như với các tính năng thư viện, nó phải được khai báo trước tiên. Đó là những gì dòng đầu tiên đang làm.

Với việc đổi tên __std_alias, nó cho phép họ cung cấp bí danh mới cho không gian tên. Bạn có thể quyết định làm điều này trong mã của riêng bạn một ngày nào đó.

Có lẽ bạn muốn sử dụng shared_ptr trong mã của bạn nhưng không muốn dành mã của bạn để sử dụng tăng không gian tên hoặc tiêu chuẩn. Vì vậy, bạn có thể tạo một bí danh, và "điểm" nó tại một trong hai tăng hoặc std. Cùng với các tính năng khác có trong thư viện tăng cường mà sau này trở thành tiêu chuẩn.

Điều này không buộc bạn sử dụng không gian tên này cho mọi thứ vì bạn có thể có nhiều hơn một bí danh và bạn có thể có nhiều hơn một dấu trỏ đến cùng một không gian tên thực.

Giả sử chúng tôi muốn gọi thư viện con trỏ thông minh của chúng tôi là sml. Chúng ta có thể làm

namespace sml = boost; // or std 

ở một nơi trong các mã và #include <boost/shared_ptr.hpp> từ thời điểm đó trong mã (cùng một tiêu đề).

Ở mọi nơi khác trong mã của chúng tôi, chúng tôi sử dụng sml::shared_ptr. Nếu chúng ta chuyển từ tăng sang std, chỉ cần thay đổi một tiêu đề, không phải tất cả mã của bạn.

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