2010-10-28 41 views
17

thể trùng lặp:
Why is 'using namespace std;' considered a bad practice in C++?Đang sử dụng không gian tên..như không?

Mỗi lần tôi sử dụng using namespace std tôi luôn luôn nhận được rằng "thats một thói quen lập trình khủng khiếp". Bây giờ tôi đã tốt nghiệp vào tháng 12 này với B.S. trong C.S. nhưng tôi không yêu cầu phải biết tất cả mọi thứ, nhưng không ai từng giải thích tại sao điều này lại tệ đến thế. Tôi hiểu những gì nó làm nhưng tôi thành thật không thấy một thỏa thuận lớn với nó.

Bất cứ ai quan tâm giải thích? Trong tâm trí của tôi, nó chỉ làm cho việc gõ cout trở nên dễ chịu hơn nhiều so với std::cout.

Tôi có thể hiểu lý do bạn không muốn đặt nó vào tệp tiêu đề, nhưng chỉ trong tệp triển khai bình thường ... Tôi không hiểu tại sao nó lại là vấn đề.

+1

'sử dụng không gian tên std' là lỗi cú pháp trong' C'. Nhưng 'using',' namespace' và 'std' của chính họ là các định danh hợp pháp hoàn toàn (mặc dù đáng ghét) bạn có thể sử dụng trong mã của mình. – pmg

+1

@pmg Không ai đề cập gì về C? – meagar

+10

Sử dụng "thích" trong một câu như vậy là xấu ... –

Trả lời

14

tìm thấy bài đăng hữu ích này ở nơi khác:

Không gian tên riêng và chức năng tổ chức. Bạn có thể có hàm xander333::sort() và nó sẽ không xung đột với std::sort() hoặc boost::sort() hoặc bất kỳ loại sắp xếp nào khác(). Không có không gian tên, chỉ có thể có sort().

Bây giờ, giả sử bạn đã đặt "using namespace std;" trong tất cả các tệp nguồn của bạn và bạn đã triển khai một hàm templated đơn giản được gọi là fill() trong không gian tên chung của một trong các tệp của bạn. Tệp này cũng phụ thuộc vào tiêu đề từ libFoo - foo.hpp. Phiên bản 2.1 của libFoo xuất hiện và đột nhiên chương trình của bạn không còn biên dịch nữa. Phiên bản của fill() đột nhiên xung đột với một số khác fill()! Chuyện gì đã xảy ra?

Nó chỉ ra rằng những người thực hiện libFoo bao gồm trong phiên bản mới của foo.hpp khi họ không trước đây. Bây giờ bạn có tất cả các thuật toán chuẩn được đưa vào tệp nguồn của bạn và using namespace std; đã kéo tất cả chúng vào không gian tên chung. std::fill() hiện đang xung đột trực tiếp với fill() của bạn.

Ngạc nhiên hơn, bạn đã nhận được mã của mình để biên dịch bằng cách đổi tên fill() thành xander333_fill(), nhưng có điều gì đó không hoạt động đúng - số báo cáo của bạn bị tắt. Nó chỉ ra rằng hàm divides() tùy chỉnh của bạn, không thực hiện phép toán chính xác, không còn được gọi vì hàm templated (cũng mới được bao gồm bởi foo.hpp) làm cho một kết hợp tốt hơn bởi vì bạn đang gọi các kiểu không khớp chính xác với các kiểu khai báo .

Chủ đề thảo luận với liên quan là ở đây:

http://www.cplusplus.com/forum/unices/27805/

+3

Hoặc để nói đơn giản hơn, thật dễ dàng để có được va chạm tên trong tương lai và chúng có thể xảo quyệt để sửa chữa sau khi thực tế. – Inverse

2

sở thích của tôi là:

  1. không bao giờ đặt một chỉ thị sử dụng trong một tập tin tiêu đề (những điều mà bao gồm tiêu đề của bạn có thể không thích thực tế rằng bạn buộc họ phải có chỉ thị sử dụng).

  2. luôn làm những việc như sử dụng std :: cout; ở trên cùng của các tập tin thực hiện vì vậy tôi không phải làm std :: cout ở khắp mọi nơi trong mã của tôi.

+2

kiểm tra thuật ngữ: sử dụng không gian tên std; và những thứ tương tự được gọi là sử dụng các chỉ thị (không sử dụng các câu lệnh). sử dụng std :: cout vv được gọi bằng cách sử dụng các khai báo.:) –

+0

Đã một thời gian dài kể từ khi tôi làm C++ - thx tôi sẽ sửa nó :-) – TofuBeer

3

một "thực hành tốt" mà tôi biết không phải là để đưa using namespace trong bao gồm các file, nhưng được tự do sử dụng nó để khẩu vị của bạn trong các tập tin cpp riêng của bạn. Tôi biết những người thích tất cả mọi thứ để có đủ điều kiện, và một số (như tôi) giả định rằng string là một số std::string trừ khi có quy định khác.

Lý do cho điều này là nếu/khi người khác sử dụng tệp bao gồm của bạn (và điều này xảy ra luôn), họ buộc phải chấp nhận kiểu lập trình của bạn.

Chúc may mắn!

23

Không có vấn đề sử dụng using namespace std trong tập tin nguồn của bạn khi bạn sử dụng nặng của STL và biết chắc chắn rằng không có gì sẽ va chạm.

Tuy nhiên, rất thường xuyên bạn không cần phải sử dụng using namespace std hay không trong toàn bộ file:

Bạn có biết bạn có thể:

void somefunction() 
{ 
    // Use it in a particular scope 
    using namespace std; 

    cout << "test" << endl; 
} 
+2

Caveat: bạn thực sự không thể biết chắc chắn. (Trừ khi bạn không bao giờ thay đổi phiên bản trình biên dịch/thư viện) – sehe

1

Đó là chủ yếu về quản lý tốt. Nếu bạn không thực sự sẽ sử dụng nhiều hơn một số định danh trong một không gian tên, tại sao làm lộn xộn không gian tên của riêng bạn bằng cách đổ tất cả các mã định danh từ không gian tên đó vào của bạn? Bạn nên sử dụng using std::cout. Tuy nhiên, nếu bạn sử dụng một không gian tên rất nhiều và nó không gây ra bất kỳ va chạm nào, hãy tiếp tục và sử dụng using namespace.

0

Tránh sử dụng câu lệnh cho toàn bộ không gian tên giúp ngăn chặn xung đột không chủ ý giữa các thư viện. Giả sử bạn đã tạo lớp của riêng bạn có cùng tên với tên trong số std, sau đó trừ khi bạn sử dụng rõ ràng std:: bạn sẽ có xung đột tên.

Có lẽ tốt nhất là cố gắng tránh xung đột như thế này ngay từ đầu, nhưng nếu bạn chỉ định không gian tên cho mỗi thành viên trong mã của bạn, nó sẽ ít mơ hồ hơn.

Nếu bạn cảm thấy mệt mỏi khi gõ std :: cout mọi lúc, bạn có thể sử dụng câu lệnh sử dụng cho thành viên đó.

1

Một lý do khác để không sử dụng using ngoài việc tránh xung đột tên có khả năng là tăng tốc IDE của bạn và có thể biên dịch.

Nếu bạn đang sử dụng Visual Studio, using namespace std và/hoặc using namespace boost có thể tiêu diệt hoàn toàn intellisense. Có rất nhiều biểu tượng trong các không gian tên mà bạn có thể không nhận ra và bán chúng vào không gian tên chung có thể là lố bịch.

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