Câu trả lời:
Về cơ bản, bạn đang đề cập đến phần §7.3.1.1 / 2 từ Tiêu chuẩn C ++ 03,
Việc sử dụng từ khóa tĩnh không được dùng nữa khi khai báo các đối tượng trong phạm vi không gian tên; không gian tên không tên cung cấp một sự thay thế vượt trội.
Lưu ý rằng đoạn này đã bị xóa trong C ++ 11. static
chức năng theo tiêu chuẩn không còn bị phản đối!
Tuy nhiên, không gian tên Không được đặt tên là vượt trội so với các từ khóa tĩnh, chủ yếu là do các từ khóa static
chỉ áp dụng cho các biến khai báo và chức năng, không cho người sử dụng xác định các loại .
Đoạn mã sau hợp lệ trong C ++
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
Nhưng mã này KHÔNG hợp lệ:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
Vì vậy, giải pháp là, không gian tên không tên, đây là,
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
Hy vọng nó giải thích rằng tại sao unnamed-namespace
là tốt hơn static
.
Ngoài ra, lưu ý rằng việc sử dụng từ khóa tĩnh không được dùng nữa khi khai báo các đối tượng trong phạm vi không gian tên (theo Tiêu chuẩn).
deprecated
nhận xét này đã bị xóa khỏi CCD 0x FCD mới nhất (n3225).
.cpp
đang xác định một lớp có cùng tên.
Có một vấn đề thú vị liên quan đến vấn đề này:
Giả sử bạn sử dụng static
từ khóa hoặc chưa được đặt tên namespace
để đặt một số chức năng bên trong mô-đun (đơn vị dịch), vì chức năng này có nghĩa là được sử dụng bên trong mô-đun và không thể truy cập bên ngoài mô-đun. (Các tên namespace
không có lợi thế làm cho dữ liệu và định nghĩa kiểu bên trong cũng vậy, bên cạnh các hàm).
Theo thời gian, tệp nguồn của việc triển khai mô-đun của bạn phát triển lớn và bạn muốn chia nó thành nhiều tệp nguồn riêng biệt, cho phép tổ chức mã tốt hơn, tìm định nghĩa nhanh hơn và được biên dịch độc lập.
Nhưng bây giờ bạn phải đối mặt với một vấn đề: Các chức năng đó không còn có thể là static
mô-đun nữa, vì static
thực tế không đề cập đến mô-đun , mà là tệp nguồn (đơn vị dịch). Bạn buộc phải làm cho chúng không static
cho phép chúng được truy cập từ các phần khác (tệp đối tượng) của mô-đun đó. Nhưng điều này cũng có nghĩa là chúng không còn bị ẩn / riêng tư đối với mô-đun: có liên kết bên ngoài, chúng có thể được truy cập từ các mô-đun khác, đây không phải là ý định ban đầu của bạn.
Chưa đặt tên namespace
sẽ không giải quyết được vấn đề này, bởi vì nó cũng được xác định cho một tệp nguồn cụ thể (đơn vị dịch) và không thể được truy cập từ bên ngoài.
Nó sẽ là tuyệt vời nếu người ta có thể xác định rằng một số namespace
là private
, có nghĩa là, bất cứ điều gì được định nghĩa trong nó, có nghĩa là để được sử dụng trong nội bộ bởi module nó thuộc về. Nhưng tất nhiên, C ++ không có khái niệm như "mô-đun", chỉ có "đơn vị dịch", được liên kết chặt chẽ với các tệp nguồn.
Tiêu chuẩn C ++ đọc trong phần 7.3.1.1 Không gian tên không tên, đoạn 2:
Việc sử dụng từ khóa tĩnh không được dùng nữa khi khai báo các đối tượng trong phạm vi không gian tên, không gian tên không tên cung cấp một sự thay thế vượt trội.
Tĩnh chỉ áp dụng cho tên của các đối tượng, hàm và các hiệp hội ẩn danh, không áp dụng cho khai báo kiểu.
static
hoạt động.