[Khóa học C++] Bài 14 - Naming conflicts and the std namespace

Share:

Giả sử rằng team bạn có 3 người cùng phát triển một sản phẩm nhỏ bằng C++, một người viết file main.cpp, một người viết file a.cpp, người cuối cùng viết b.cpp, không may trong file a.cpp và b.cpp đều có hàm tên doSomething như ví dụ sau:

Các identifier (biến hay function) trong C++ bắt buộc phải khác tên với nhau, nếu có 2 identifier trùng tên với nhau, lỗi naming collision sẽ xảy ra.

Ở trong ví dụ trên, khi compiler chạy, chương trình sẽ biên dịch từng file riêng lẻ, và giai đoạn biên dịch diễn ra suôn sẻ, không có lỗi xuất hiện. Nhưng khi đến giao đoạn linker, chương trình sẽ xảy ra lỗi vì có 2 identifier cùng tên.

Thông thường những lỗi trùng tên identifier thường xảy ra trong 2 trường hợp sau:
  • Hai file trong cùng một project có một hàm (hoặc biến toàn cục) trùng tên như ví dụ trên (gây ra lỗi linker)
  • Một source file nào đó include một header file, mà trong header file này là có một identifier trùng tên với identifier trong source file của bạn (gây ra lỗi compile). Bạn sẽ biết và tìm hiểu header file trong bài sau.
Trong thực tế, một chương trình rất lớn, nghĩa là nó có rất nhiều identifier, tỉ lệ có 2 identifier trùng tên là có xảy ra, bạn sẽ làm cách nào để giải quyết chuyện này?
C++ hổ trợ một một cách để giải quyết chuyện này là namespace (một cách khác là local scope mà bạn sẽ được học trong các bài sau).

The std namespace

Khi C++ mới được thiết kế ra, tất cả các identifier trong thư viện chuẩn (C++ standard library) như cin và cout được sử dụng một cách trực tiếp. Tuy nhiên, điều này có nghĩa là bất kì identifier nào trong thư viện chuẩn, đều có thể bị trùng tên với các identifier do chính bạn define. Vì lý do này, C++ đã di chuyển tất cả các identifier trong thư viện chuẩn vào một vùng đặc biệt gọi là namespace.

Một namespace đảm bảo rằng tất cả các identifier trong namespace đó là độc nhất. Bạn có thể sử dụng 2 identifier cùng tên nếu 2 identifier nằm trong 2 namespace khác nhau.

Tất cả các identifier trong thư viện chuẩn đều nằm trong namespace std. Từ nay, khi bạn sử dụng thư viện chuẩn, identifier phải kèm với namespace thông qua prefix std::, ví dụ std::cout là cách dùng hàm cout.
Khi bạn sử dụng một identifier trong một namespace, bạn phải dùng cả tên namespace cùng với identifier theo cú pháp: <tên namespace>::<tên identifier>
Kết thúc



1 nhận xét: