Câu hỏi Tại sao "sử dụng không gian tên std" được coi là thực hành xấu?


Tôi đã được những người khác nói rằng using namespace std trong mã là sai, và rằng tôi nên sử dụng std::cout và std::cin thay vào đó.

Tại sao lại là using namespace std coi là một thực tế xấu? Nó có hiệu quả hay không nguy cơ khai báo các biến không rõ ràng (các biến có cùng tên với một hàm trong std không gian tên)? Nó có ảnh hưởng đến hiệu suất không?


2069
2017-09-21 03:08


gốc


Đừng quên bạn có thể làm: "using std :: cout;" điều đó có nghĩa là bạn không phải gõ std :: cout, nhưng không mang lại toàn bộ không gian tên std cùng một lúc. - Bill
@a nerd trả tiền google-styleguide.googlecode.com/svn/trunk/… liên kết không hoạt động nữa. Có vẻ như liên kết mới là google.github.io/styleguide/cppguide.html#Other_C++_Features - MCG
Nó đặc biệt xấu khi sử dụng 'using namespace std' ở phạm vi tệp trong các tệp tiêu đề. Sử dụng nó trong các tệp nguồn (* .cpp) tại phạm vi tệp sau khi tất cả bao gồm không phải là khá xấu, vì hiệu ứng của nó được giới hạn trong một đơn vị dịch duy nhất. Thậm chí ít vấn đề hơn là sử dụng nó bên trong các hàm hoặc các lớp, vì hiệu ứng của nó bị giới hạn trong phạm vi hàm hoặc lớp. - sh-
Tôi sẽ không khuyến khích sử dụng chỉ thị bằng cách sử dụng nhưng đối với các không gian tên cụ thể như std::literals::chrono_literals, Poco::Data:Keywords,Poco::Units và những thứ sẽ đối phó với các thủ đoạn văn học hoặc khả năng đọc. Bất cứ khi nào nó nằm trong các tệp đầu trang hoặc tệp triển khai. Nó có thể là ok trong một phạm vi chức năng tôi đoán, nhưng ngoài các chữ và các công cụ, nó không phải là hữu ích. - Ludovic Zenohate Lagouardette
@ Jon: Nó không có gì để làm với namespace std nói riêng. Sự nhấn mạnh của tôi có nghĩa là được "ở phạm vi tập tin trong các tập tin tiêu đề". Để đặt nó như một lời khuyên: Không sử dụng "sử dụng không gian tên" (std hoặc khác) tại phạm vi tập tin trong các tập tin tiêu đề. Bạn có thể sử dụng nó trong các tệp triển khai. Xin lỗi vì sự mơ hồ. - sh-


Các câu trả lời:


Điều này không liên quan đến hiệu suất. Nhưng hãy xem xét điều này: bạn đang sử dụng hai thư viện có tên là Foo và Bar:

using namespace foo;
using namespace bar;

Mọi thứ hoạt động tốt, bạn có thể gọi Blah() từ Foo và Quux() từ Bar không có vấn đề gì. Nhưng một ngày bạn nâng cấp lên phiên bản mới của Foo 2.0, hiện có chức năng gọi là Quux(). Bây giờ bạn đã có một cuộc xung đột: Cả nhập Foo 2.0 và Bar Quux() vào không gian tên chung của bạn. Điều này sẽ mất một số nỗ lực để sửa chữa, đặc biệt là nếu các thông số chức năng xảy ra để phù hợp.

Nếu bạn đã sử dụng foo::Blah() và bar::Quux(), sau đó giới thiệu foo::Quux() sẽ là một sự kiện không.


1751
2017-09-21 03:13



Tôi đã luôn luôn thích của Python "nhập big_honkin_name như bhn" để bạn có thể sau đó chỉ cần sử dụng "bhn.something" hơn là "big_honkin_name.something" - thực sự cắt giảm trên đánh máy. Có C + + có một cái gì đó như thế? - paxdiablo
@Pax namespace io = boost :: hệ thống tập tin; - AraK
Tôi nghĩ rằng đó là phóng đại những điều để nói rằng đó là "một số nỗ lực để sửa chữa". Bạn sẽ không có phiên bản mới nào của foo :: Quux vì vậy bạn chỉ cần định hướng tất cả các công dụng hiện tại của bạn với bar :: Quux. - MattyT
Có bất kỳ người hợp lý nào tạo ra một thư viện với các loại có tên không đủ tiêu chuẩn va chạm với các loại std không? - erikkallen
@TOMA: Vấn đề với #define là nó không hạn chế chính nó đến các không gian tên, mà là các điểm chà đạp trên toàn bộ cơ sở mã. Một bí danh không gian tên là những gì bạn muốn. - sbi


Tôi đồng ý với mọi thứ Greg đã viết, nhưng tôi muốn thêm: Nó thậm chí còn tệ hơn cả Greg!

Thư viện Foo 2.0 có thể giới thiệu một hàm, Quux(), đó là một trận đấu rõ ràng hơn cho một số cuộc gọi của bạn Quux() hơn là bar::Quux() mã của bạn được gọi trong nhiều năm. Sau đó của bạn mã vẫn biên dịch, nhưng nó âm thầm gọi hàm sai và không biết điều gì. Đó là về xấu như mọi thứ có thể nhận được.

Hãy nhớ rằng std không gian tên có tấn số nhận dạng, nhiều trong số đó là rất những người bình thường (nghĩ list, sort, string, iterator, vv) cũng rất có khả năng xuất hiện trong mã khác.

Nếu bạn cho rằng điều này khó xảy ra: Có một câu hỏi ở đây trên Stack Overflow, nơi khá chính xác điều này xảy ra (sai chức năng gọi là do bỏ qua std:: tiền tố) khoảng nửa năm sau khi tôi đưa ra câu trả lời này. Đây là một ví dụ khác gần đây về một câu hỏi như vậy. Đây là một vấn đề thực sự.


Dưới đây là một điểm dữ liệu khác: Nhiều, nhiều năm trước, tôi cũng đã từng thấy khó chịu khi phải thêm tiền tố từ thư viện chuẩn std::. Sau đó, tôi làm việc trong một dự án, nơi nó đã được quyết định ngay từ đầu mà cả hai using các chỉ thị và tuyên bố bị cấm ngoại trừ phạm vi chức năng. Đoán cái gì? Phải mất hầu hết chúng ta vài tuần để làm quen với việc viết tiền tố, và sau vài tuần nữa, hầu hết chúng ta đều đồng ý rằng nó thực sự tạo ra mã dễ đọc hơn. Có một lý do cho điều đó: Cho dù bạn thích văn xuôi ngắn hơn hay dài hơn là chủ quan, nhưng các tiền tố thêm khách quan rõ ràng cho mã. Không chỉ trình biên dịch, nhưng bạn cũng thấy dễ dàng hơn để xem định danh nào được nhắc tới.

Trong một thập kỷ, dự án đó đã phát triển có vài triệu dòng mã. Vì các cuộc thảo luận này lặp đi lặp lại, tôi đã từng tò mò về mức độ thường xuyên phạm vi chức năng (được phép) usingthực sự đã được sử dụng trong dự án. Tôi grep'd các nguồn cho nó và chỉ tìm thấy một hoặc hai chục nơi mà nó đã được sử dụng. Với tôi điều này cho thấy rằng, một khi đã thử, các nhà phát triển không tìm thấy std:: đủ đau đớn để sử dụng chỉ thị ngay cả một lần 100 kLoC ngay cả khi nó được phép sử dụng.


Tóm lại: Tiền tố rõ ràng tất cả mọi thứ không làm hại, mất rất ít làm quen với, và có lợi thế khách quan. Đặc biệt, nó làm cho mã dễ hiểu hơn bởi trình biên dịch và bởi người đọc của con người - và điều đó có lẽ nên là mục tiêu chính khi viết mã.


1152
2017-09-21 09:26



Nó làm hại đáng kể mật độ mã bạn có thể gói trong một dòng. Bạn kết thúc viết mã của bạn theo một cách rất dài; làm giảm khả năng đọc. Cá nhân, tôi nghĩ rằng ngắn hơn (nhưng không quá ngắn) mã có xu hướng dễ đọc hơn (vì có ít công cụ để đọc, và ít công cụ để có được phân tâm về). - Lie Ryan
Đoán bạn đã bỏ lỡ những ngày trước khi C ++ có một tiêu chuẩn string lớp học, và dường như mọi thư viện đều có riêng của họ. Cho bạn biết điều gì: Chúng tôi sẽ tiếp tục viết mã của chúng tôi std::và bạn có thể chạy mã của chúng tôi thông qua grep -v std:: | vim khi bạn duyệt qua. Hoặc bạn có thể dạy cho biên tập viên của mình rằng std:: là một từ khóa được tô màu giống như màu nền. Dù có hiệu quả. - Mike DeSimone
Tôi không nghĩ std:: có hại. Nó mang thông tin rất quan trọng (cụ thể là "bất cứ điều gì đến sau là một phần của thư viện chuẩn", và nó vẫn là một tiền tố khá ngắn và nhỏ gọn. Hầu hết thời gian, nó không có vấn đề gì cả. Đôi khi, bạn có một vài dòng mã nơi bạn cần tham khảo các ký hiệu cụ thể trong std không gian tên rất nhiều, và sau đó là using tuyên bố trong phạm vi cụ thể đó giải quyết vấn đề một cách độc đáo. Nhưng trong trường hợp chung, nó không phải là tiếng ồn, nó truyền tải thông tin giá trị ngoài ra để loại bỏ sự mơ hồ. - jalf
Bất cứ khi nào tôi thấy std::, Tôi biết nó sẽ đến từ std:: mà không cần phải suy nghĩ về nó. Nếu tôi thấy string hoặc là list hoặc là map một mình, tôi tự hỏi một chút. - Mateen Ulhaq
@LieRyan Sau đó, chúc may mắn viết một thư viện hình học mà không bao giờ đặt tên một cái gì đó vector, transform hoặc là distance. Và đó chỉ là ví dụ về nhiều tên rất phổ biến được sử dụng trong thư viện chuẩn. Gợi ý không sử dụng chúng từ nỗi sợ hãi hoặc ý kiến ​​thiên vị về tính năng không gian tên là một phần không thể tách rời của C ++ khá hiệu quả. - Christian Rau


Tôi nghĩ sẽ rất tệ khi đặt nó vào các tệp tiêu đề của các lớp: bởi vì sau đó bạn sẽ buộc bất kỳ ai muốn sử dụng các lớp của bạn (bằng cách bao gồm các tệp tiêu đề của bạn) cũng được 'sử dụng' (nghĩa là nhìn mọi thứ trong) các không gian tên khác .

Tuy nhiên, bạn có thể cảm thấy tự do để đặt một tuyên bố sử dụng trong tập tin * .cpp (riêng) của bạn.


Cẩn thận rằng một số người không đồng ý với câu nói của tôi "cảm thấy tự do" như thế này - bởi vì mặc dù một tuyên bố sử dụng trong một tệp cpp là tốt hơn so với tiêu đề (vì nó không ảnh hưởng đến những người bao gồm tệp tiêu đề của bạn), họ nghĩ rằng nó vẫn không tốt (bởi vì tùy thuộc vào mã nó có thể làm cho việc thực thi lớp khó khăn hơn để duy trì). Chủ đề FAQ này nói,

Chỉ thị sử dụng tồn tại cho mã C ++ kế thừa và để dễ dàng chuyển đổi sang các không gian tên, nhưng có thể bạn không nên sử dụng nó một cách thường xuyên, ít nhất là không có trong mã C ++ mới của bạn.

Nó gợi ý hai lựa chọn thay thế:

  • Tuyên bố sử dụng:

    using std::cout; // a using-declaration lets you use cout without qualification
    cout << "Values:";
    
  • Nhận qua nó và chỉ cần gõ std ::

    std::cout << "Values:";
    

309
2017-09-21 03:22



Nó là ít xấu để đặt nó trong một tập tin .cpp hơn trong một tiêu đề, nhưng vấn đề vẫn giữ nguyên cho bảo trì. Có nguy cơ là hai hàm có cùng tên sẽ xung đột khi mã / thư viện bạn sử dụng / tiêu chuẩn C ++ được sửa đổi. - Étienne
Bạn đã thử điều này chưa? Bởi vì chỉ thị không gian tên sử dụng sẽ không chuyển sang tệp khác. (GCC 4.8+) - zackery.fix
@ zackery.fix, "Apple LLVM phiên bản 7.0.2 (clang-700.1.81)" tuyên truyền using namespace std; từ tiêu đề đến tệp nguồn và tôi đã xác minh rằng GCC không. Vì vậy, ít nhất có chỉ thị "sử dụng" trong tiêu đề là nguy hiểm. - Franklin Yu
Yea .. Tôi không sử dụng LLVM hoặc kêu vang và điều này không phải là một cách tiếp cận tiêu chuẩn anyway. - zackery.fix
Bạn thực sự không nên nói với mọi người "cảm thấy tự do" bằng cách sử dụng không gian tên std trong tệp .cpp. @ Étienne là đúng. - einpoklum


Gần đây tôi đã gặp khiếu nại về Visual Studio 2010. Nó bật ra rằng khá nhiều tất cả các tập tin nguồn có hai dòng:

using namespace std;
using namespace boost;

rất nhiều Tăng cường các tính năng đang đi vào tiêu chuẩn C ++ 0x, và Visual Studio 2010 có rất nhiều tính năng C ++ 0x, vì vậy đột nhiên các chương trình này không biên dịch.

Do đó, tránh using namespace X; là một hình thức chống tương lai, một cách để đảm bảo thay đổi đối với thư viện và / hoặc tệp tiêu đề đang được sử dụng sẽ không phá vỡ chương trình.


197
2017-10-28 17:37



Điều này. Boost và std có một nhiều chồng chéo - đặc biệt là từ C ++ 11. - einpoklum
Tôi đã làm điều đó một lần và học một bài học một cách khó khăn. Bây giờ tôi không bao giờ sử dụng using bên ngoài định nghĩa hàm và hiếm khi sử dụng using namespace ở tất cả. - Ferruccio


Phiên bản ngắn: không sử dụng toàn cầu bằng cách sử dụng các khai báo hoặc chỉ thị trong các tập tin tiêu đề. Hãy sử dụng chúng trong các tệp triển khai. Đây là những gì Herb Sutter và Andrei Alexandrescu phải nói về vấn đề này trong Tiêu chuẩn mã hóa C ++ (bolding để nhấn mạnh là của tôi):

Tóm lược

Việc sử dụng không gian tên là thuận tiện cho bạn, không phải để bạn gây ra cho người khác: Không bao giờ viết một tuyên bố sử dụng hoặc chỉ thị sử dụng trước một chỉ thị #include.

Hệ quả: Trong các tệp tiêu đề, không viết cấp độ không gian tên bằng các chỉ thị hoặc sử dụng các khai báo; thay vào đó, đủ điều kiện không gian tên rõ ràng tất cả các tên. (Quy tắc thứ hai sau từ quy tắc đầu tiên, vì tiêu đề không bao giờ có thể biết tiêu đề #includes khác có thể xuất hiện sau chúng).

Thảo luận

Tóm lại: Bạn có thể và nên sử dụng không gian tên bằng cách sử dụng các khai báo và chỉ thị một cách tự do trong các tệp triển khai của bạn sau #include chỉ thị và cảm thấy tốt về nó. Mặc dù có nhiều xác nhận lặp đi lặp lại, không gian tên sử dụng các khai báo và chỉ thị không phải là điều ác và chúng không đánh bại mục đích của các không gian tên. Thay vào đó, chúng là những gì làm cho không gian tên có thể sử dụng được.


159
2017-11-03 20:00



Buồn rằng hướng dẫn lành mạnh này được chôn vùi dưới những câu trả lời sai lầm. - nyholku
Chỉ cần thêm một ý kiến ​​lập trình viên ở đây, nhưng trong khi tôi đồng ý 100% với tuyên bố rằng từ đó using không bao giờ xuất hiện trong tiêu đề, tôi không bị thuyết phục về giấy phép miễn phí để đặt using namespace xyz; bất cứ nơi nào trong mã của bạn, đặc biệt nếu xyz Là std. tôi sử dụng using std::vector; hình thức, vì nó chỉ kéo một phần tử duy nhất từ ​​không gian tên vào phạm vi toàn cầu giả, do đó dẫn đến nguy cơ va chạm ít hơn nhiều. - dgnuff
@ Cuộc đua độ cao trong Orbit bạn tất nhiên được hưởng ý kiến ​​của bạn. Sẽ hữu ích hơn nếu có một số cố gắng giải thích tại sao bạn không đồng ý với lời khuyên được đưa ra trong câu trả lời này. Đặc biệt sẽ là thú vị để hiểu được những gì là điểm của không gian tên nếu 'sử dụng' chúng là xấu? Tại sao không chỉ đặt tên std_cout thay vì std :: cout ... những người sáng tạo của C ++ / namespace phải có một số ý tưởng khi họ làm phiền để tạo chúng. - nyholku
@nyholku: Không cần - phần lớn các câu trả lời khác cũng đưa ra những lý do tương tự. Ngoài ra xin vui lòng không ngần ngại lưu ý ":)" Tôi nối thêm vào bình luận của tôi! Và tôi không nói không gian tên là xấu. - Lightness Races in Orbit
Vâng, tôi nhận thấy rằng :) nhưng IMO phần lớn các câu trả lời (mà đi ngược lại lời khuyên hiền triết này) là sai lầm (không phải là tôi đã thực hiện bất kỳ số liệu thống kê đa số bây giờ là gì). Nếu bạn đồng ý rằng không gian tên là 'không tệ' thì bạn có thể nói nơi bạn cho rằng chúng phù hợp nếu bạn không đồng ý với câu trả lời này? - nyholku


Người ta không nên sử dụng bằng cách sử dụng chỉ thị ở phạm vi toàn cầu, đặc biệt là trong các tiêu đề. Tuy nhiên có những tình huống mà nó thích hợp ngay cả trong một tệp tiêu đề:

template <typename FloatType> inline
FloatType compute_something(FloatType x)
{
    using namespace std; //no problem since scope is limited
    return exp(x) * (sin(x) - cos(x * 2) + sin(x * 3) - cos(x * 4));
}

Điều này là tốt hơn so với trình độ rõ ràng (std::sin, std::cos...) bởi vì nó ngắn hơn và có khả năng làm việc với các kiểu dấu chấm động do người dùng xác định (thông qua Tra cứu phụ thuộc đối số).


103
2017-09-21 15:47



Tôi xin lỗi, nhưng tôi rất không đồng ý với điều này. - Billy ONeal
@ Billy: Không có cách nào khác để hỗ trợ gọi userlib :: cos (userlib :: superint). Mỗi tính năng đều có sử dụng. - Zan Lynx
@Zan: Tất nhiên là có. using std::cos; , using std::sin, vv Vấn đề là dù có được thiết kế tốt userlib sẽ có sin và cos bên trong không gian tên riêng của họ, vì vậy điều này thực sự không giúp bạn. (Trừ khi có using namespace userlib trước mẫu này và điều đó cũng tệ như using namespace std - và phạm vi không có giới hạn.) Hơn nữa, chức năng duy nhất như thế này tôi từng thấy điều này xảy ra là swapvà trong những trường hợp như vậy, tôi khuyên bạn chỉ nên tạo chuyên môn về mẫu std::swap và tránh toàn bộ vấn đề. - Billy ONeal
@BillyONeal: template<typename T> void swap(MyContainer<T>&, MyContainer<T>&) (Không có chức năng chuyên môn hóa một phần mẫu (FTPS), vì vậy đôi khi bạn cần phải sử dụng quá tải để thay thế. - sbi
@BillyONeal: Nhận xét của bạn (bình chọn 7 lần!) Là sai - tình huống bạn mô tả là chính xác những gì ADL được thiết kế để trang trải. Tóm lại, nếu x có một hoặc nhiều "không gian tên được liên kết" (ví dụ: nếu nó được xác định trong namespace userlib) sau đó bất kỳ cuộc gọi chức năng nào trông giống như cos(x) sẽ Ngoài ra nhìn vào những không gian tên đó - không có bất kì using namespace userlib; trước là cần thiết. Zan Lynx là đúng (và tra cứu tên C ++ là byzantine ...) - j_random_hacker


Không sử dụng nó trên toàn cầu

Nó được coi là "xấu" chỉ khi được sử dụng trên toàn cầu. Bởi vì:

  • Bạn làm lộn xộn không gian tên bạn đang lập trình.
  • Người đọc sẽ gặp khó khăn khi thấy một từ định danh cụ thể đến từ đâu, khi bạn sử dụng nhiều using namespace xyz.
  • Điều gì là đúng cho khác độc giả của mã nguồn của bạn thậm chí còn đúng hơn với người đọc thường xuyên nhất của nó: chính bạn. Hãy quay lại sau một hoặc hai năm và xem ...
  • Nếu bạn chỉ nói về using namespace std bạn có thể không biết tất cả những thứ bạn lấy - và khi bạn thêm một thứ khác #include hoặc chuyển sang bản sửa đổi C ++ mới, bạn có thể nhận được xung đột tên mà bạn không biết.

Bạn có thể sử dụng nó cục bộ

Hãy tiếp tục và sử dụng nó một cách tự do (gần như). Điều này, tất nhiên, ngăn cản bạn lặp lại std:: - và sự lặp lại cũng tệ.

Một thành ngữ để sử dụng nó cục bộ

Trong C ++ 03 có một mã thành ngữ - bản mẫu - để thực hiện swap cho các lớp học của bạn. Người ta cho rằng bạn thực sự sử dụng một địa phương using namespace std -- hoặc ít nhất using std::swap:

class Thing {
    int    value_;
    Child  child_;
public:
    // ...
    friend void swap(Thing &a, Thing &b);
};
void swap(Thing &a, Thing &b) {
    using namespace std;      // make `std::swap` available
    // swap all members
    swap(a.value_, b.value_); // `std::stwap(int, int)`
    swap(a.child_, b.child_); // `swap(Child&,Child&)` or `std::swap(...)`
}

Điều này làm phép thuật sau đây:

  • Trình biên dịch sẽ chọn std::swap cho value_, I E. void std::swap(int, int).
  • Nếu bạn bị quá tải void swap(Child&, Child&) triển khai trình biên dịch sẽ chọn nó.
  • Nếu bạn làm không phải có quá tải trình biên dịch sẽ sử dụng void std::swap(Child&,Child&) và cố gắng trao đổi chúng tốt nhất.

Với C ++ 11, không có lý do gì để sử dụng mẫu này nữa. Việc thực hiện std::swap đã được thay đổi để tìm một tình trạng quá tải tiềm ẩn và chọn nó.


80
2018-01-18 09:34



"Việc thực hiện std :: trao đổi đã được thay đổi để tìm một tình trạng quá tải tiềm năng và chọn nó." - Gì? Bạn có chắc chắn về điều đó không? Mặc dù đúng là cung cấp tùy chỉnh swap ở nơi đầu tiên không còn quan trọng trong C ++ 11 nữa, vì std::swap bản thân nó linh hoạt hơn (sử dụng ngữ nghĩa di chuyển). Nhưng std::swap tự động lựa chọn trao đổi tùy chỉnh của riêng bạn, điều đó hoàn toàn mới đối với tôi (và tôi không thực sự tin điều đó). - Christian Rau
@ChristianRau Tôi nghĩ vậy, vâng. Tôi đọc điều này trên SO ở đâu đó. Chúng tôi luôn có thể hỏi Howard, anh ta nên biết. tôi là đào bới và đào bới hiện nay... - towi
Ngay cả trong trường hợp trao đổi, thành ngữ rõ ràng hơn (và may mắn hơn) là viết using std::swap;thay vì using namespace std;. Thành ngữ cụ thể hơn có ít tác dụng phụ hơn và do đó làm cho mã dễ bảo trì hơn. - Adrian McCarthy
Câu cuối cùng là sai. Trong C ++ 11 Std Swap Hai Bước đã được chính thức ban phước như đúng cách gọi swapvà nhiều nơi khác trong tiêu chuẩn đã được thay đổi để nói rằng họ gọi swap như vậy (N.B. như đã nêu ở trên, using std::swap là đúng cách, không using namespace std). Nhưng std::swap chính nó đã được nhấn mạnh không phải thay đổi để tìm một số khác swap và sử dụng nó. Nếu std::swap được gọi, sau đó std::swap được sử dụng. - Jonathan Wakely
Nó có thể khôn ngoan hơn khi chỉ cần gõ using std::swap mặc dù cục bộ, để giảm không gian tên cục bộ trong khi đồng thời tạo mã tự tạo tài liệu. Bạn hiếm khi quan tâm đến toàn bộ không gian tên std, vì vậy chỉ cần chọn ra các phần bạn quan tâm. - Lundin


Nếu bạn nhập các tệp tiêu đề phù hợp, bạn đột nhiên có các tên như hex, left, plus hoặc là count trong phạm vi toàn cầu của bạn. Điều này có thể gây ngạc nhiên nếu bạn không biết rằng std:: chứa những cái tên này. Nếu bạn cũng cố gắng sử dụng các tên này tại địa phương, nó có thể dẫn đến một số nhầm lẫn.

Nếu tất cả các công cụ chuẩn đều nằm trong không gian tên riêng của nó, bạn không phải lo lắng về các xung đột tên với mã của bạn hoặc các thư viện khác.


71
2017-09-21 03:23



+1 chưa kể distance. tôi vẫn thích những cái tên không đủ điều kiện ở bất cứ đâu khả năng, vì điều đó làm tăng khả năng đọc cho tôi. Ngoài ra, tôi nghĩ thực tế là chúng ta thường không đủ điều kiện trong bài phát biểu bằng lời nói và sẵn sàng dành thời gian giải quyết sự mơ hồ có thể, có nghĩa là nó có giá trị để có thể hiểu những gì người ta đang nói mà không có bằng cấp và được áp dụng cho nguồn mã có nghĩa là nó được cấu trúc theo cách mà nó rõ ràng những gì nó là tất cả về ngay cả khi không có bằng cấp. - Cheers and hth. - Alf
Để công bằng, mặc dù, bạn không có hầu hết những người nếu bạn không bao gồm <iomanip>. Tuy nhiên, điểm tốt. - einpoklum


Tôi đồng ý rằng nó không nên được sử dụng trên toàn cầu, nhưng nó không phải là quá xấu để sử dụng tại địa phương, như trong một namespace. Đây là một ví dụ từ "Ngôn ngữ lập trình C ++" :

namespace My_lib {

    using namespace His_lib; // everything from His_lib
    using namespace Her_lib; // everything from Her_lib

    using His_lib::String; // resolve potential clash in favor of His_lib
    using Her_lib::Vector; // resolve potential clash in favor of Her_lib

}

Trong ví dụ này, chúng tôi đã giải quyết các xung đột về tên tiềm năng và sự mơ hồ phát sinh từ thành phần của họ.

Tên được khai báo rõ ràng ở đó (bao gồm cả tên được khai báo bằng cách sử dụng các khai báo như His_lib::String) ưu tiên hơn các tên được truy cập trong phạm vi khác bằng chỉ thị sử dụng (using namespace Her_lib).


34
2017-08-29 09:44





Các lập trình viên có kinh nghiệm sử dụng bất cứ điều gì giải quyết vấn đề của họ và tránh bất cứ điều gì tạo ra các vấn đề mới, và họ tránh sử dụng các chỉ dẫn cấp tập tin tiêu đề vì lý do chính xác này.

Các lập trình viên có kinh nghiệm cũng cố gắng tránh trình độ đầy đủ các tên bên trong các tệp nguồn của họ. Một lý do nhỏ cho điều này là nó không phải là thanh lịch để viết nhiều mã hơn khi mã ít hơn là đủ trừ khi có lý do chính đáng. Một lý do chính cho việc này là tắt tra cứu phụ thuộc đối số (ADL).

Cái gì đây lý do chính đáng? Đôi khi các lập trình viên rõ ràng muốn tắt ADL, những lúc khác họ muốn phân biệt.

Vì vậy, sau đây là OK:

  1. Các chỉ thị sử dụng mức chức năng và các khai báo sử dụng bên trong các triển khai của các hàm
  2. Các khai báo sử dụng cấp tệp nguồn bên trong các tệp nguồn
  3. (Đôi khi) hướng dẫn sử dụng cấp tập tin nguồn

34
2018-03-29 08:10



Xác định "thanh lịch". - sbi