Vincent Robert đã đúng trong nhận xét của mình Làm thế nào để bạn sử dụng đúng không gian tên trong C ++? .
Sử dụng không gian tên
Không gian tên được sử dụng ít nhất để giúp tránh va chạm tên. Trong Java, điều này được thi hành thông qua thành ngữ "org.domain" (vì người ta cho rằng người ta sẽ không sử dụng bất cứ thứ gì khác ngoài tên miền của chính mình).
Trong C ++, bạn có thể cung cấp một không gian tên cho tất cả mã trong mô-đun của mình. Ví dụ, đối với mô-đun MyModule.dll, bạn có thể cung cấp cho mã của nó không gian tên MyModule. Tôi đã thấy người khác sử dụng MyCompany :: MyProject :: MyModule. Tôi đoán điều này là quá mức cần thiết, nhưng tất cả trong tất cả, nó có vẻ đúng với tôi.
Sử dụng "sử dụng"
Việc sử dụng nên được sử dụng hết sức cẩn thận vì nó nhập hiệu quả một (hoặc tất cả) các ký hiệu từ một không gian tên vào không gian tên hiện tại của bạn.
Điều này là xấu khi thực hiện nó trong tệp tiêu đề vì tiêu đề của bạn sẽ gây ô nhiễm mọi nguồn bao gồm cả nó (nó làm tôi nhớ về macro ...) và ngay cả trong tệp nguồn, kiểu xấu bên ngoài phạm vi chức năng vì nó sẽ nhập ở phạm vi toàn cầu các ký hiệu từ không gian tên.
Cách an toàn nhất để sử dụng "sử dụng" là nhập các ký hiệu chọn:
void doSomething()
{
using std::string ; // string is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
std::cout << a << std::endl ;
}
void doSomethingElse()
{
using namespace std ; // everything from std is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
cout << a << endl ;
}
Bạn sẽ thấy rất nhiều "sử dụng không gian tên std;" trong mã hướng dẫn hoặc ví dụ. Lý do là để giảm số lượng các biểu tượng để làm cho việc đọc dễ dàng hơn, không phải vì đó là một ý tưởng tốt.
"sử dụng không gian tên std;" Scott Meyers không khuyến khích (tôi không nhớ chính xác cuốn sách nào, nhưng tôi có thể tìm thấy nó nếu cần thiết).
Thành phần không gian tên
Không gian tên là nhiều hơn gói. Một ví dụ khác có thể được tìm thấy trong "Ngôn ngữ lập trình C ++" của Bjarne Stroustrup.
Trong "Phiên bản đặc biệt", tại 8.2.8 Thành phần không gian tên , anh mô tả cách bạn có thể hợp nhất hai không gian tên AAA và BBB vào một tên gọi khác là CCC. Do đó, CCC trở thành bí danh cho cả AAA và BBB:
namespace AAA
{
void doSomething() ;
}
namespace BBB
{
void doSomethingElse() ;
}
namespace CCC
{
using namespace AAA ;
using namespace BBB ;
}
void doSomethingAgain()
{
CCC::doSomething() ;
CCC::doSomethingElse() ;
}
Bạn thậm chí có thể nhập các biểu tượng được chọn từ các không gian tên khác nhau, để xây dựng giao diện không gian tên tùy chỉnh của riêng bạn. Tôi vẫn chưa tìm thấy một ứng dụng thực tế của việc này, nhưng trên lý thuyết, nó thật tuyệt.
std
không gian tên cho các biểu tượng thay vì sử dụngusing
tất cả. Vì vậy, tôi luôn luôn viếtstd::cout
hoặcstd::string
bây giờ bởi vì đó là những gì tôi gọi chúng bây giờ. Tôi sẽ không bao giờ chỉ viếtcout
.