Có nên sử dụng using namespace std
hay không ?
Không nên
Chúng ta thường không thích việc gõ đi gõ lại std::
, nên nhiều khi thích sử dụng using namespace std
hơn. Khi sử dụng using namespace std
, compiler sẽ nhìn thấy tất cả các hàm khai báo trong namespace std
, kể cả những thứ mà chúng ta không nghĩ tới sẽ dùng đến. Nói một cách khác, điều này dẫn đến việc xung đột tên (name conflicts).
Ví dụ, bạn có một đoạn code dùn để đếm và bạn sử dụng biến hoặc hàm có tên count
. Tuy nhiên std library
cũng sử dụng count
(trong std algorithms), điều này dẫn đến việc không rõ ràng về ngữ nghĩa (ambiguties)
Ý nghĩa của việc sử dụng namespace
là để tránh xung đột namespace giữa hai source code phát triển độc lập nhau. Using-directive
(using namespace XYZ) sẽ import toàn bộ nội dung của 1 namespace vào 1 namespace khác, điều này vô tình đi ngược lại mục đích trên. Using-directive
tồn tại cho các đoạn mã legacy C++, nhưng bạn có lẽ không lên sử dụng nó thường xuyên ít nhất là với các đoạn mã phát triền mới.
Nếu bạn thực sự muốn tránh phải gõ std::
, bạn có thẻ sử dụng using-declaration
. Hoặc đơn giản hơn là khiến bản thân không ngại gõ std::
nữa :v
Sử dụng một using-declaration
sẽ specific cho 1 name cụ thể. Ví dụ, để sử dụng std::cout
, bạn có thể thêm using std::cout
#include <vector>
#include <iostream>
void f(const std::vector<double>& v)
{
using std::cout; // ← a using-declaration that lets you use cout without qualification
cout << "Values:";
for (auto value : v)
cout << ' ' << value;
cout << '\n';
}
Hoặc trở về phương án nguyên thuỷ (the un-solution):
#include <vector>
#include <iostream>
void f(const std::vector<double>& v)
{
std::cout << "Values:";
for (auto value : v)
std::cout << ' ' << value;
std::cout << '\n';
}
Bạn có thể sử dụng cách nào cũng được, nhưng nên nhớ thống nhất với coding standards đã được lựa chọn sử dụng trong team. Bởi dù sao bạn cũng chỉ là 1 phần của một team lớn hơn mà thôi.