2008-10-18 32 views
16

Khi sử dụng C++ không gian tên, làm bạn muốn đặt tên cho họ một cách rõ ràng, như thế này:Bạn có thích không gian tên rõ ràng hoặc 'sử dụng' trong C++ không?

std::cout << "Hello, world!\n"; 

Hoặc bạn có thích using namespace:

using namespace std; 
cout << "Hello, world!\n"; 

Và nếu nếu bạn thích sau này, làm bạn khai báo của bạn sử dụng ở phạm vi tập tin hoặc chức năng?

Cá nhân tôi thích đặt tên rõ ràng hơn - đó là cách nhập nhiều hơn nhưng khi sử dụng hỗn hợp các không gian tên (ví dụ: stdboost) Tôi thấy nó dễ đọc hơn.

Trả lời

17

Tôi luôn sử dụng using namespace cho std & tăng. Mọi thứ khác tôi có xu hướng sử dụng một không gian tên rõ ràng trừ khi nó được sử dụng quá nhiều đến mức nó sẽ làm lộn xộn mã.

Trong tiêu đề, tôi không bao giờ sử dụng using namespace để tránh gây ô nhiễm không gian tên chung của #including source.

2

Tôi chỉ sử dụng không gian tên rõ ràng khi có sự mơ hồ. Nó dễ đọc hơn, nhưng việc gõ thừa là quá tẻ nhạt, và bạn phải thừa nhận các nhà phát triển khác có mức độ quen thuộc với các thư viện chuẩn.

Lần duy nhất tôi đánh vần không gian tên là khi tôi chỉ sử dụng nó một lần hoặc hai lần, như thêm vào một câu lệnh gỡ lỗi nhanh, hoặc nếu tôi đang sử dụng một số thư viện không chuẩn.

Tôi thường khai báo không gian tên ở phạm vi tệp, nhưng nếu bạn đang trộn các không gian tên, có thể có ý nghĩa để đặt khai báo gần với điểm được sử dụng, trong phạm vi chức năng.

19

Tôi luôn sử dụng những nội dung khiêu dâm. Viết std không làm tổn thương tôi và tôi thấy rõ nó ở đâu. Nó rất hữu ích khi bạn có một số dự án di sản để chăm sóc với nó là "chuỗi" riêng của nó, "vectơ" vv để duy trì. Càng nhiều thông tin mã mang theo thì càng tốt.

+1

Nó không đau cho đến khi có một mẫu chuyên môn mà bạn bỏ lỡ vì bạn đã xác định không gian tên một cách rõ ràng . Tôi phải thừa nhận rằng tôi cũng làm điều tương tự với habbit, nhưng đó là điều mà tôi nghĩ một cách nghiêm túc hơn khi đọc cuốn "Hiệu quả C++" của Meyer. – paxos1977

+0

Thats chỉ bao giờ thực sự là một vấn đề cho min và max cho tôi trong thực tế, tiếp tục butchered bởi một tiêu đề MS cũng làm một #define min và tối đa – paulm

4

Quy tắc chung của tôi luôn sử dụng rõ ràng không gian tên trong tiêu đề và thường sử dụng trong mã. Lý do của điều này là làm cho nó rõ ràng rõ ràng trong mọi phần của định nghĩa cái đang được sử dụng, và lý do thứ hai là nó làm cho nó dễ dàng sử dụng các thay thế từ một không gian tên khác nếu điều đó trở nên cần thiết. tức là nếu chúng ta muốn bắt đầu sử dụng foo :: string thay vì std :: string, chúng ta chỉ cần cập nhật header và câu lệnh using thay vì thay thế mọi instance của std :: string với foo :: string trong đoạn mã. Tất nhiên, điều đó ít hữu ích hơn đối với các lớp nằm trong không gian tên std :: vì ngay cả khi bạn thay thế một lớp, bạn vẫn có khả năng sử dụng các lớp khác trong std, và có thể chạy vào các vấn đề mơ hồ, nhưng đó là chỉ là một ví dụ.

19

Nhập liệu bổ sung không phải là vấn đề ở đây. Vấn đề với tên đủ điều kiện rõ ràng là sự lộn xộn hình ảnh. Hãy đối mặt với nó, cú pháp C++ là lộn xộn. Không cần phải làm điều này tồi tệ hơn bằng cách không cần thiết làm cho tên dài hơn và rắc mã rộng rãi với :: s.

Tôi có Jeff Atwood: The Best Code is No Code At All. Đúng đấy.

Nhập tên không gian là cách tuyệt vời để giảm sự lộn xộn mà không có nhược điểm: Miễn là phạm vi của không gian tên đã mở được giảm xuống đơn vị biên dịch đơn , xung đột tên, xuất hiện, có thể được giải quyết dễ dàng.

Tại sao tên rõ ràng nên (nói chung) dễ đọc hơn luôn là điều bí ẩn đối với tôi. Các độc giả thường nên biết mã đủ tốt để có thể suy luận ngữ nghĩa. Nếu không, mã vẫn cần sửa.


1) Hệ luỵ: không using trong tiêu đề!

+0

Tôi nghĩ rằng "hình ảnh lộn xộn" là một điểm lạ, nếu std :: là xấu như vậy thì tại sao lại sử dụng C++. – paulm

+0

@paulm Tôi không hiểu lý lẽ của bạn. Nghe có vẻ phức tạp: chỉ vì C++ là tiết nói chung không có nghĩa là chúng tôi không thể cải thiện mã của chúng tôi. –

1

using ở phạm vi chức năng, hoặc nếu chức năng là rất nhỏ (thường là), chỉ cần không gian tên rõ ràng

4

usingusing namespace rất rất hữu ích để làm cho mã dễ đọc hơn - loại bỏ sự lộn xộn.

Nhưng trong bất kỳ trường hợp nào làm cho việc tìm ra biểu tượng đến từ đâu khó hơn, tôi từ chối nhập toàn bộ không gian tên của nó.

tôi cố gắng limiit phạm vi của không gian tên nhập khẩu:

void bar() { 

    // do stuff without vector 

    { using std::vector; 
     // do stuff with vector 
    } 

    // do stuff without vector 
} 

Đối với "thường được biết đến" thư viện, như std, tôi dám sử dụng using namespace std. Có lý do để tin rằng mọi người đọc mã này đều biết những biểu tượng này.

Là một phụ trang, từ khóa using cũng được sử dụng để chỉ ra rằng một lớp dẫn xuất cũng xuất các thành viên quá tải của siêu lớp của nó.

class A { 
    void f(A ); 
    void f(bool); 
}; 

class B : public A { 
    using A::f; // without this, we get a compilation error in foo() 
    void f(bool); 
}; 

void foo() { 
    B b; 
    b.f(A()); // here's a compilation error when no `using` is used in B 
} 
2

tôi có xu hướng nhập khẩu một cách rõ ràng những cái tên mà tôi cần ở phía trên cùng của tập tin cpp, vì vậy ...

using std :: cout; sử dụng std :: endl;

vv ...

Bằng cách đó tôi có thể kiểm soát các tên mà tôi sử dụng và rất dễ dàng để xem nơi họ đến từ và mã không lộn xộn tại các điểm sử dụng.

Trong những trường hợp hiếm hoi mà tôi đang sử dụng hai tên từ các không gian tên khác nhau, tôi hoàn toàn đủ điều kiện tại thời điểm sử dụng.

tôi luôn luôn sử dụng tên đầy đủ trong tiêu đề và hầu như không bao giờ sử dụng 'using namespace x' bất cứ nơi nào ...

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