Tôi sẽ cố gắng trả lời câu hỏi của bạn, mặc dù nó là một câu hỏi cũ, và nó không giống rất quan trọng (nó thực sự không phải là rất quan trọng của riêng mình ), và nó đã nhận được câu trả lời khá tốt rồi. Lý do tôi muốn trả lời là nó liên quan đến các vấn đề cơ bản của quá trình phát triển tiêu chuẩn và thiết kế ngôn ngữ khi ngôn ngữ dựa trên một ngôn ngữ hiện có: khi nào thì các tính năng ngôn ngữ không được dùng, loại bỏ hoặc thay đổi theo những cách không tương thích?
Trong C ++, có thể sử dụng từ khóa static trong một đơn vị dịch để ảnh hưởng đến khả năng hiển thị của một biểu tượng (khai báo biến hoặc hàm).
Mối liên kết thực sự.
Trong n3092, tính năng này không được dùng nữa:
Việc ngừng sử dụng cho biết:
- Các ý định để loại bỏ một số tính năng trong tương lai; điều này không có nghĩa là các tính năng không dùng nữa sẽ bị xóa trong bản sửa đổi tiêu chuẩn tiếp theo hoặc chúng phải bị xóa "sớm", hoặc hoàn toàn. Và các tính năng không dùng nữa có thể bị xóa trong bản sửa đổi tiêu chuẩn tiếp theo.
- Một nỗ lực chính thức để ngăn cản việc sử dụng nó .
Điểm thứ hai là quan trọng. Mặc dù không bao giờ có một lời hứa chính thức rằng chương trình của bạn sẽ không bị phá vỡ, đôi khi âm thầm, theo tiêu chuẩn tiếp theo, ủy ban nên cố gắng tránh phá vỡ mã "hợp lý". Việc không dùng nữa sẽ cho các lập trình viên biết rằng việc phụ thuộc vào một số tính năng là không hợp lý .
Tuy nhiên, nó nhấn mạnh rằng để tương thích với C (và khả năng biên dịch các chương trình C thành C ++), việc không dùng nữa thật khó chịu. Tuy nhiên, việc biên dịch một chương trình C trực tiếp dưới dạng C ++ có thể là một trải nghiệm khó chịu, vì vậy tôi không chắc liệu nó có đảm bảo được sự cân nhắc hay không.
Điều rất quan trọng là phải bảo toàn một tập hợp con chung C / C ++, đặc biệt là đối với các tệp tiêu đề. Tất nhiên, static
khai báo toàn cục là khai báo ký hiệu có liên kết nội bộ và điều này không hữu ích lắm trong tệp tiêu đề.
Nhưng vấn đề không bao giờ chỉ là khả năng tương thích với C, mà là khả năng tương thích với C ++ hiện có: có rất nhiều chương trình C ++ hợp lệ hiện có sử dụng static
khai báo toàn cục. Mã này không chỉ hợp pháp về mặt hình thức, mà còn hợp lý, vì nó sử dụng một đặc điểm ngôn ngữ được xác định rõ theo cách mà nó được dự định sử dụng .
Chỉ bởi vì bây giờ có một "cách tốt hơn" (theo một số người) để làm điều gì đó không làm cho các chương trình được viết theo cách cũ "xấu" hoặc "không hợp lý". Khả năng sử dụng static
từ khóa trên khai báo các đối tượng và hàm ở phạm vi toàn cục được hiểu rõ trong cả cộng đồng C và C ++, và thường được sử dụng đúng cách nhất.
Tương tự, tôi sẽ không thay đổi phôi kiểu C double
thành static_cast<double>
chỉ vì "phôi kiểu C là xấu", vì static_cast<double>
thêm thông tin bằng không và không an toàn.
Ý tưởng rằng bất cứ khi nào một cách mới để làm điều gì đó được phát minh, tất cả các lập trình viên sẽ vội vã viết lại mã làm việc đã được xác định rõ ràng hiện có của họ thật là điên rồ. Nếu bạn muốn loại bỏ tất cả các vấn đề và sự xấu xí kế thừa của C, bạn không thay đổi C ++, bạn phát minh ra một ngôn ngữ lập trình mới. Việc loại bỏ một nửa việc sử dụng static
hầu như không làm cho C ++ ít C xấu hơn.
Thay đổi mã cần một lời biện minh, và "cũ là xấu" không bao giờ là lời biện minh cho những thay đổi mã.
Thay đổi ngôn ngữ phá vỡ cần một sự biện minh rất mạnh mẽ. Làm cho ngôn ngữ trở nên đơn giản hơn một chút không bao giờ là lý do biện minh cho một sự thay đổi đột phá.
Các lý do được đưa ra tại sao static
xấu chỉ là yếu đáng kể, và thậm chí không rõ tại sao cả hai đối tượng và khai báo hàm không được dùng cùng nhau - việc xử lý chúng khác nhau hầu như không làm cho C ++ đơn giản hơn hoặc trực giao hơn.
Vì vậy, thực sự, đó là một câu chuyện buồn. Không phải vì hậu quả thực tế mà nó gây ra: nó không có hậu quả thực tế chính xác. Nhưng vì nó cho thấy sự thiếu hiểu biết rõ ràng từ ủy ban ISO.