Sự vượt trội của không gian tên không tên so với tĩnh?


Câu trả lời:


133

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. staticchứ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 staticchỉ á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-namespacelà 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).


11
Tổng quát hơn, một không gian tên không tên cho phép liên kết bên ngoài. Đó là những gì cho phép khai báo lớp đơn vị-dịch-cục bộ. Nó cũng cho phép hằng số chuỗi liên kết ngoài, được sử dụng làm đối số khuôn mẫu.
Chúc mừng và hth. - Alf

10
Theo ghi nhận của Fred Nurk về một câu trả lời khác của bạn, có vẻ như deprecatednhận xét này đã bị xóa khỏi CCD 0x FCD mới nhất (n3225).
Matthieu M.

36
Bạn đang trả lời câu hỏi của chính mình và nói lời cảm ơn với chính mình: -o
manpreet singh

11
Điều gì sẽ là sự khác biệt so với việc chỉ định nghĩa lớp trong cpp (không có không gian tên ẩn danh, không có tĩnh)?
Luchian Grigore

6
@LuchianGrigore Liên kết rắc rối trong trường hợp 2 .cppđang xác định một lớp có cùng tên.
Xaqq

8

Có một vấn đề thú vị liên quan đến vấn đề này:

Giả sử bạn sử dụng statictừ 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 namespacekhô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à staticmô-đun nữa, vì staticthự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 staticcho 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 namespacesẽ 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ố namespaceprivate, 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.


3
Dù sao, đó sẽ là một hack và một giải pháp hạn chế, nhưng bạn có thể bao gồm (các) tệp cpp với các hàm tĩnh hoặc tên được đặt trong các tệp cpp 'chính' của bạn. Sau đó loại trừ (các) tệp cpp 'vệ tinh' khỏi bản dựng và bạn đã hoàn tất. Vấn đề duy nhất nếu bạn có hai hoặc nhiều tệp cpp 'chính' và cả hai đều muốn sử dụng chức năng tuyệt vời đó từ một trong các tệp cpp của 'vệ tinh' ...
Sergey

không sử dụng kế thừa với private / bảo vệ / công khai với các chức năng tĩnh giải pháp?
Ali

C ++ 20 giới thiệu các mô-đun, giải quyết vấn đề của bạn.
LF

4

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.


5
Không, nó không. Một dự thảo đã làm. Và một dự thảo khác rất nhanh sau đó đã hoàn nguyên sự thay đổi ngớ ngẩn này.
gạch dưới
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.