Tại sao các từ khóa xấu xí trong C11?


15

Tôi hiện đang đọc một bản thảo của đặc tả C11. Các từ khóa được giới thiệu mới: _Bool, _Alignof, _Atomictất cả đều cảm thấy giống như các tiện ích mở rộng tùy chỉnh, thay vì các từ khóa dành riêng tiêu chuẩn như struct, union, int.

Tôi nhận ra rằng tiêu chuẩn về cơ bản bao gồm các phần mở rộng được tiêu chuẩn hóa ... nhưng vẫn còn, điều này thật tồi tệ! Có lẽ chúng ta sẽ sớm kết thúc với việc __Long_Long_Reallylong_Integer_MSVC_2020_tleo trong tiêu chuẩn!

Là khả năng tương thích ngược của mã không chuẩn là lý do duy nhất cho phong cách mới của từ khóa?


2
Không, tôi sẽ không lo lắng về các loại thực sự dài như thế. Số lượng kết hợp chữ cái và số của _, az, AZ và 0-9 có nghĩa là chúng có thể chỉ ngắn và khó nhớ.
Neil

2
Một từ đồng nghĩa tìm kiếm đẹp hơn cho mỗi từ khóa thường được xác định trong tệp tiêu đề thư viện tiêu chuẩn có liên quan. Ví dụ: bất kỳ <stdbool.h>tệp tiêu đề thực hiện C11 nào cũng phải bao gồm macro tiền xử lý, chẳng hạn như #define bool _Bool. Đây là một giải pháp gọn gàng vì nó vẫn giữ được khả năng tương thích ngược, nhưng cho phép mọi mã mới, bao gồm tệp tiêu đề mới, sử dụng cú pháp hấp dẫn hơn.
andrew.punnett

Câu trả lời:


20

Tôi tưởng tượng rằng khả năng tương thích ngược với mã tiêu chuẩn hoàn hảo là một lý do quan trọng hơn.

Nếu bạn thêm một từ khóa có thể đã được sử dụng làm định danh hợp pháp trong mã trước đó, bạn sẽ tạo ra rất nhiều lỗi, các lỗi tinh vi có thể xảy ra, đặc biệt là trong C, một ngôn ngữ có quy tắc phân tích cú pháp phức tạp.

Nếu các số nhận dạng này được sử dụng làm giao diện công cộng ở đâu đó, bạn sẽ thêm đau đớn cho tất cả người dùng của các thư viện không may đó, những người không thể sử dụng C, nhưng gọi thư viện từ Ruby hoặc Python, v.v.

Đó là lý do tại sao các từ khóa mới nhất định trông giống như những từ hay và giống như các bản hack-on mà mọi người có cơ hội sử dụng ít hơn cho mục đích khác.


Cần phải chỉ ra rằng câu hỏi liên quan đến C không phải C ++ không phải là vấn đề. Câu trả lời của bạn bao gồm lý do rằng một loại được cung cấp mới sẽ được đặt tên là một cái gì đó để tránh sử dụng gây ra xung đột với một loại tùy chỉnh Booltrong mã kế thừa được chấp nhận rộng rãi là Boolean nhưng thực sự không phải là một phần của tiêu chuẩn C nên giả định không an toàn làm.
Ramhound

1
@Ramhound, IMHO bool sẽ có tinh thần hơn C. Ngoài ra, tôi không hoàn toàn bị thuyết phục bởi câu trả lời này, vì những từ xấu xí cũng có thể được sử dụng bởi mã không chuẩn. Và thay đổi phong cách của các từ làm cho các từ tiêu chuẩn khó nhận ra trong nháy mắt.
Vorac

6
@Vorac: Vấn đề là nếu boolđược thêm vô điều kiện vào ngôn ngữ, thì tất cả các dự án có phiên bản (hoàn toàn hợp pháp) của riêng chúng boolsẽ ngừng biên dịch. Điều đó sẽ gây tổn hại nghiêm trọng đến việc chấp nhận sửa đổi ngôn ngữ. Đây là lý do mà tất cả các định danh mới đang được lấy từ tập hợp dành riêng (do đó bắt đầu bằng _[capital]). Vì cũng có một nhu cầu lớn cho boolchính nó, điều này đã được thêm vào như typedef _Bool booltrong <stdbool.h>.
Bart van Ingen Schenau

1
@BartvanIngenSchenau - Cho phép mọi người thay thế typedef của chính họ bằng một giá trị Boolean thành một trong đó stdbool.hhoặc cập nhật typedef của riêng họ sang loại mới để hỗ trợ mã kế thừa của họ.
Ramhound

1
@Ramhound - những người có biến số xung đột với từ khóa C11 mới cũng có thể "Vì vậy, không sử dụng nó?". Có một cờ biên dịch std = xxx để ngăn chặn mọi xung đột với các tiêu chuẩn ngôn ngữ mới.
Xe tay ga

8

Các tên bắt đầu bằng dấu gạch dưới và chữ in hoa (và bất cứ thứ gì có dấu gạch dưới kép) được dành riêng cho trình biên dịch / triển khai thư viện chuẩn trong các tiêu chuẩn trước đó.

Từ định danh dành riêng của C89 và C99:

Cũng dành riêng cho người triển khai là tất cả các mã định danh bên ngoài bắt đầu bằng dấu gạch dưới và tất cả các mã định danh khác bắt đầu bằng dấu gạch dưới theo sau là chữ in hoa hoặc dấu gạch dưới.

Vì vậy, về mặt lý thuyết, những từ khóa mới này không nên được sử dụng trong bất kỳ mã nào được viết trước đó và điều đó dẫn đến khả năng tương thích ngược tốt hơn bất kỳ tên đơn giản nào, đây có thể là lý do duy nhất.


4
Bạn nên trích dẫn và có thể liên kết đến hoặc đặt tên cho phần tiêu chuẩn thích hợp để người khác có thể xác minh tuyên bố của bạn một cách nhanh chóng. Điều này sẽ cải thiện câu trả lời của bạn.
SpaceTrucker
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.