using namespace std; đưa toàn bộ namespace std vào scope hiện tại, gây "ô nhiễm namespace" (namespace pollution).
Vấn đề
- Trùng tên: Nếu bạn định nghĩa hàm
count()hoặc classlist, sẽ xung đột vớistd::count,std::list. - Khó đọc: Không rõ
vectorlàstd::vectorhay custom. - Rủi ro bảo trì: Thêm header mới có thể đưa symbol mới vào std, phá vỡ code cũ.
Ví dụ xung đột
#include <iostream>
#include <vector>
#include <algorithm> // có std::count
using namespace std;
int count = 10; // LỖI: trùng với std::count (function template)
// int count; // error: 'count' ambiguous
void count() {} // LỖI: trùng tên hàm
// void count(); // error: 'count' ambiguous
Thực hành tốt (Best Practices)
// 1. Chỉ dùng trong file .cpp, KHÔNG trong header (.h/.hpp)
using std::cout; using std::cin; using std::endl; // Chỉ lấy cái cần
// 2. Hoặc dùng prefix std:: (khuyên dùng nhất)
std::vector<int> v;
std::cout << "Hello\n";
// 3. Namespace alias cho tên dài
namespace fs = std::filesystem;
fs::path p = "file.txt";
// 4. Trong block scope cục bộ (hạn chế phạm vi)
void func() {
using namespace std; // Chỉ ảnh hưởng trong func()
cout << "OK\n";
}
Khi nào chấp nhận được?
- Code ví dụ, tutorial, competitive programming (ngắn, kiểm soát).
- File .cpp nội bộ, không phải header công khai.