Namespace trong C++ và tiền tố tên trong C
Trong bài học này, bạn sẽ tìm hiểu cách tránh trùng tên hàm trong chương trình lớn bằng namespace của C++ và quy ước tiền tố tên trong C.
Giới thiệu
Trong chương trình lớn hoặc khi dùng nhiều thư viện, rất dễ xảy ra trường hợp hai hàm trùng tên. C++ giải quyết vấn đề này bằng namespace, một vùng chứa các tên riêng biệt. C không có namespace, nên các thư viện C thường thêm tiền tố (prefix) vào tên, ví dụ math_square.
Những điểm quan trọng
- Hiểu cách làm trong C trước khi học các công cụ trừu tượng của C++.
- Dùng RAII và ngữ nghĩa giá trị (value semantics) để thể hiện quyền sở hữu tài nguyên.
- Ưu tiên các công cụ an toàn kiểu của C++ thay vì macro và ép kiểu.
Code ví dụ bằng C và C++
#include <stdio.h>
int math_square(int value) {
return value * value;
}
int main(void) {
printf("%d\n", math_square(7));
}
49
#include <iostream>
namespace math {
int square(int value) {
return value * value;
}
}
int main() {
std::cout << math::square(7) << '\n';
}
49
So sánh C và C++
Trong C, tiền tố math_ chỉ là quy ước đặt tên và hoàn toàn dựa vào sự cẩn thận của lập trình viên. Trong C++, hàm square nằm trong namespace math và được gọi bằng tên đầy đủ math::square. Trình biên dịch tự đảm bảo các tên trong những namespace khác nhau không xung đột, đồng thời cho phép đặt bí danh (alias) cho namespace có tên dài.
C dùng quy ước đặt tên, callback, macro và struct chứa ngữ cảnh.
C++ có sẵn các công cụ trừu tượng có phạm vi rõ ràng, an toàn kiểu và thường không tốn thêm chi phí khi chạy.
Bài tập mở rộng
Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.
- Tự viết cơ chế bằng C trước, rồi mới dùng tính năng tương ứng của C++.
- Thay việc giải phóng tài nguyên thủ công bằng RAII.
- Kiểm tra xem tính năng có phát sinh cấp phát bộ nhớ hoặc lời gọi hàm ảo hay không.