2012-01-01 31 views
8

Theo spec, tên toàn cầu với dấu gạch hàng đầu không được phép:Các tên bên trong một không gian tên ẩn danh trong phạm vi toàn cầu có dấu gạch dưới dẫn đầu không?

17.4.3.1.2 tên toàn cầu
- Mỗi tên bắt đầu với một dấu gạch dưới được dành riêng để thực hiện để sử dụng như một tên trong không gian tên chung.

Điều này cũng áp dụng cho các tên được xác định trong không gian tên ẩn danh cấp cao nhất?

+0

Ở mức BEST, nó sẽ thực sự là hình thức thực sự kém nếu bạn quyết định sử dụng dấu gạch dưới hàng đầu trên bất kỳ tên biến nào của bạn. – paulsm4

+1

@ paulsm4 Đây là thư viện liên kết tăng để xác định trình giữ chỗ đối số ('_1',' _2', v.v ...). – StackedCrooked

+2

Một không gian tên không xác định không đặc biệt đặc biệt; nó chỉ là một không gian tên bình thường, được đặt tên duy nhất với một ngầm sử dụng chỉ thị mà đưa tên của nó vào không gian tên kèm theo. Tuy nhiên, có một câu hỏi thú vị ở đây: một tên có thể được đưa vào không gian tên chung thông qua một chỉ thị sử dụng vi phạm quy tắc này? –

Trả lời

3

Có. Nhưng câu nói đó không đề cập đến điều đó (như bạn đã biết).

Dưới đây là những gì tôi nghĩ áp dụng cho rằng:

17.4.3.1.3 ngoài liên kết

3. Mỗi tên có hai dấu gạch dưới liên tiếp (2.11) được dành riêng cho việc triển khai để sử dụng làm tên với cả liên kết "C" bên ngoài và bên ngoài "C++".

Tôi nghĩ rằng nó áp dụng cho các biến khai báo với mối liên hệ bên ngoài, trong không gian tên vô danh, nhưng cần lưu ý rằng nó nói về đôi dấu gạch dưới. Vì vậy:

namespace 
{ 
    std::string __s1; //not allowed 
    std::string _s2; //allowed (allowed, as I understand) 
} 

Một chủ đề tổng quát hơn:

+0

Ngoài ra, 'std :: string _S3;' sẽ không được cho phép. –

+0

@JamesMcNellis: Bạn có nghĩa là '_s2' được cho phép, nhưng' _S3' không phải là (nhấn mạnh chữ hoa)? Tuyên bố nào từ spec cấm nó? – Nawaz

+0

Xem dấu đầu dòng đầu tiên trong trích dẫn đầu tiên trong câu trả lời được chấp nhận của câu hỏi mà bạn liên kết. –

6

Tên bắt đầu với một hàng đầu gạch dưới theo sau là một nhân vật tự chữ và số phi vốn và không bao gồm một dấu gạch dưới đôi chỉ Reserved trong không gian tên chung. Lý do cho điều này là trên một số hệ thống, một số tên cần phải có dấu gạch dưới hàng đầu hoặc đã được sử dụng bởi hệ điều hành cơ bản và/hoặc thư viện C của nó. Tên trong một không gian tên ẩn danh không có vấn đề này.

Điều đó nói rằng, tôi luôn tự hỏi tại sao mọi người lại quan tâm đến việc sử dụng tên xấu xí! Trừ khi tôi đang ở chế độ cài đặt thư viện chuẩn (nơi mà tôi có hiệu quả phải sử dụng tên xấu xí vì sợ rằng tôi xung đột với tên người dùng) Tôi luôn tự hỏi mình có đang làm điều gì sai khi sử dụng dấu gạch dưới hàng đầu ở bất kỳ đâu trong mã của mình không! Có những trường hợp hiếm hoi cần có dấu gạch dưới hàng đầu (ví dụ: khi gọi số _exit() hoặc sử dụng trình giữ chỗ của std::bind()) nhưng người dùng thường không nên chạm vào chúng: không sử dụng hoặc xác định chúng.

+2

Tôi hoàn toàn đồng ý với tình cảm được thể hiện ở đây. '+ 1' từ tôi, tôi tình cờ biết rằng câu hỏi nảy sinh từ một cuộc thảo luận trong [phòng chat C++] (http://chat.stackoverflow.com/rooms/10/loungec), không phải vì Stacked có nghĩa là sử dụng những cái tên đó, nhưng vì những câu hỏi như vậy được nhìn thấy bởi hàng nghìn người dùng khác, tôi thấy điều quan trọng là ít nhất phải đề cập đến điều này. – sbi

Các vấn đề liên quan