Các quy tắc (không thay đổi trong C ++ 11):
- Dành riêng trong mọi phạm vi, bao gồm cả việc sử dụng làm macro thực hiện :
- các định danh bắt đầu bằng một dấu gạch dưới được theo sau bởi một chữ cái viết hoa
- định danh chứa dấu gạch dưới liền kề (hoặc "dấu gạch dưới kép")
- Dành riêng trong không gian tên toàn cầu:
- định danh bắt đầu bằng dấu gạch dưới
- Ngoài ra, mọi thứ trong
std
không gian tên được bảo lưu. (Tuy nhiên, bạn được phép thêm các chuyên môn mẫu.)
Từ tiêu chuẩn C ++ 2003:
17.4.3.1.2 Tên toàn cầu [lib.global.names]
Một số bộ tên và chữ ký chức năng luôn được dành riêng cho việc thực hiện:
- Mỗi tên có một dấu gạch dưới kép (
__
) hoặc bắt đầu bằng dấu gạch dưới theo sau là một chữ cái viết hoa (2.11) được dành riêng cho việc thực hiện cho bất kỳ việc sử dụng nào.
- Mỗi tên bắt đầu bằng dấu gạch dưới được dành riêng cho việc triển khai để sử dụng làm tên trong không gian tên toàn cầu. 165
165) Tên như vậy cũng được bảo lưu trong không gian tên ::std
(17.4.3.1).
Bởi vì C ++ dựa trên tiêu chuẩn C (1.1 / 2, C ++ 03) và C99 là một tham chiếu quy phạm (1.2 / 1, C ++ 03), những điều này cũng được áp dụng, từ Tiêu chuẩn C năm 1999:
7.1.3 Định danh dành riêng
Mỗi tiêu đề khai báo hoặc xác định tất cả các mã định danh được liệt kê trong phần phụ liên quan của nó và tùy ý khai báo hoặc xác định các định danh được liệt kê trong các thư mục và định danh thư viện tương lai liên quan luôn được dành riêng cho bất kỳ mục đích sử dụng nào hoặc để sử dụng làm định danh phạm vi tệp.
- Tất cả các định danh bắt đầu bằng một dấu gạch dưới và một chữ cái viết hoa hoặc một dấu gạch dưới khác luôn được dành riêng cho bất kỳ việc sử dụng.
- Tất cả các mã định danh bắt đầu bằng dấu gạch dưới luôn được dành riêng để sử dụng làm định danh với phạm vi tệp trong cả không gian tên thẻ thông thường và thẻ.
- Mỗi tên macro trong bất kỳ điều khoản phụ nào sau đây (bao gồm các hướng thư viện trong tương lai) được dành riêng để sử dụng như được chỉ định nếu bao gồm bất kỳ tiêu đề liên quan nào của nó; trừ khi có quy định rõ ràng khác (xem 7.1.4).
- Tất cả các mã định danh có liên kết ngoài trong bất kỳ điều khoản nào sau đây (bao gồm cả các hướng thư viện trong tương lai) luôn được dành riêng để sử dụng làm định danh với liên kết ngoài. 154
- Mỗi mã định danh có phạm vi tệp được liệt kê trong bất kỳ điều khoản phụ nào sau đây (bao gồm các hướng thư viện trong tương lai) được dành riêng để sử dụng làm tên macro và làm định danh với phạm vi tệp trong cùng một không gian tên nếu có bất kỳ tiêu đề liên quan nào của nó.
Không có định danh khác được bảo lưu. Nếu chương trình khai báo hoặc định nghĩa một mã định danh trong ngữ cảnh được bảo lưu (ngoài sự cho phép của 7.1.4) hoặc định nghĩa một mã định danh dành riêng là tên macro, thì hành vi không được xác định.
Nếu chương trình xóa (với #undef
) bất kỳ định nghĩa vĩ mô nào của mã định danh trong nhóm đầu tiên được liệt kê ở trên, hành vi không được xác định.
154) Danh mục các định danh dè chừng liên kết bên ngoài bao gồm errno
, math_errhandling
, setjmp
, và va_end
.
Những hạn chế khác có thể được áp dụng. Ví dụ: tiêu chuẩn POSIX dự trữ rất nhiều số nhận dạng có khả năng hiển thị trong mã thông thường:
- Tên bắt đầu bằng
E
chữ in theo chữ số hoặc chữ in hoa:
- có thể được sử dụng cho tên mã lỗi bổ sung.
- Tên bắt đầu bằng
is
hoặc to
theo sau là một chữ cái viết thường
- có thể được sử dụng cho các chức năng kiểm tra và chuyển đổi ký tự bổ sung.
- Tên bắt đầu
LC_
bằng chữ cái viết hoa
- có thể được sử dụng cho các macro bổ sung chỉ định các thuộc tính miền địa phương.
- Tên của tất cả các hàm toán học hiện có có
f
hoặc l
được bảo lưu
- cho các hàm tương ứng hoạt động trên các đối số float và long tương ứng.
- Tên bắt đầu
SIG
bằng chữ cái viết hoa được bảo lưu
- cho tên tín hiệu bổ sung.
- Tên bắt đầu
SIG_
bằng chữ cái viết hoa được bảo lưu
- cho các hành động tín hiệu bổ sung.
- Tên bắt đầu bằng
str
, mem
hoặc wcs
theo sau là một chữ cái viết thường được bảo lưu
- cho các hàm chuỗi và mảng bổ sung.
- Tên bắt đầu bằng
PRI
hoặc SCN
theo sau bởi bất kỳ chữ cái viết thường hoặcX
được bảo lưu
- cho các macro định dạng bổ sung
- Tên kết thúc bằng
_t
được bảo lưu
Mặc dù việc sử dụng các tên này cho mục đích riêng của bạn ngay bây giờ có thể không gây ra sự cố, nhưng chúng làm tăng khả năng xung đột với các phiên bản tương lai của tiêu chuẩn đó.
Cá nhân tôi chỉ không bắt đầu định danh với dấu gạch dưới. Bổ sung mới cho quy tắc của tôi: Không sử dụng dấu gạch dưới kép ở bất cứ đâu, điều này rất dễ vì tôi hiếm khi sử dụng dấu gạch dưới.
Sau khi thực hiện nghiên cứu về bài viết này, tôi không còn kết thúc các định danh của mình _t
vì điều này được bảo lưu theo tiêu chuẩn POSIX.
Các quy tắc về bất kỳ định danh kết thúc với _t
làm tôi ngạc nhiên rất nhiều. Tôi nghĩ rằng đó là một tiêu chuẩn POSIX (chưa chắc chắn) đang tìm kiếm sự làm rõ và chương và câu chính thức. Đây là từ hướng dẫn sử dụng GNU libtool , liệt kê các tên dành riêng.
CesarB đã cung cấp liên kết sau đến các biểu tượng và ghi chú dành riêng cho POSIX 2004 'rằng nhiều tiền tố và hậu tố dành riêng khác ... có thể được tìm thấy ở đó'. Các
biểu tượng dành riêng POSIX 2008 được xác định ở đây. Các hạn chế có phần nhiều sắc thái hơn so với những hạn chế ở trên.