Có thể bắt đầu các biến / thành viên với một câu đố gạch dưới trình biên dịch?


12

Tôi đã được dạy từ thời trung học xác định các biến như thế này:

int _a;

hoặc là

int __a;

nên xem xét thực tiễn xấu bởi vì điều này cuối cùng sẽ giải đố các trình biên dịch sử dụng các biến bắt đầu bằng dấu gạch dưới để đặt tên cho các biến tạm thời.

Theo tôi biết đây là lý do tại sao một số người thích di chuyển dấu gạch dưới ở cuối tên, như:

int a_;

Tuy nhiên, tôi thấy rất nhiều mã xung quanh sử dụng các biến bắt đầu gạch dưới. Và mã đó xây dựng khá tốt với cả Visual Studio 2010 và g ++ 4.x.

Vì vậy, tôi tự hỏi: đây có phải là một vấn đề không? Là trình biên dịch hiện đại thông minh hơn về quy ước đặt tên?


Không phải là một câu trả lời thực sự, nhưng có khả năng các trình biên dịch C ++ của Microsoft đặc biệt khoan dung hơn về vấn đề này bởi vì phong cách bên trong của Microsoft là sử dụng dấu gạch dưới trước các biến thành viên riêng (ít nhất là trong C #). Tôi biết rằng g ++ vẫn có thể có vấn đề với dấu gạch dưới hàng đầu.
KChaloux

6
Bạn có thể tìm thấy câu trả lời cho câu hỏi này hữu ích.
Blrfl

1
@KChaloux nếu bạn nghĩ nhóm trình biên dịch C ++ của Microsoft, tồn tại hơn 20 năm, đã thiết lập các quy tắc về tên định danh có thể chấp nhận dựa trên thói quen của một số người trong nhóm C #, bạn không biết Microsoft hoạt động như thế nào :-). Nghiêm túc mà nói, đã 21 năm kể từ khi họ phát hành trình biên dịch C ++ đầu tiên của họ và các quy tắc này đã lùi xa hoặc xa hơn vào cơ sở mã trình biên dịch C gốc.
Kate Gregory

@Kate Tôi chỉ chỉ ra rằng tôi biết một sự thật rằng họ đã sử dụng nó trong C #. Tôi không sử dụng trình biên dịch C ++ của Microsoft hoặc biết rất nhiều về môi trường ở đó, vì vậy tôi đã suy luận việc họ sử dụng kiểu đặt tên đó trong C ++ từ kinh nghiệm của tôi với C #. Không bao giờ đưa ra bất kỳ tuyên bố rằng quy tắc C # đến đầu tiên.
KChaloux

Câu trả lời:


17

Bạn rõ ràng đang hiểu nhầm lý do tiền tố gạch dưới là thực tiễn xấu. Nói ngắn gọn, đó là vì tiêu chuẩn C và C ++ dành những tiền tố này cho các chi tiết triển khai, ví dụ như để triển khai thư viện chuẩn. (lưu ý rằng _ và __ không được dành riêng cho cùng một thứ, xem bình luận)

Ngay cả khi các tên nằm trong phạm vi (không gian tên, lớp, v.v.), có thể có một số tên toàn cầu, cụ thể là các macro, sử dụng các tiền tố này và có thể âm thầm phá vỡ mã của bạn nếu bạn cũng sử dụng chúng.

Vì vậy, về cơ bản, hầu hết thời gian đều an toàn khi sử dụng các tiền tố này NHƯNG nếu bạn không sử dụng chúng, bạn phải đảm bảo 100% rằng việc đặt tên của bạn sẽ không bao giờ xung đột với tên thực hiện.

Đó là lý do tại sao, nghi ngờ, không sử dụng các tiền tố này.


3
ý kiến ​​của bạn áp dụng cho tiền tố của hai dấu gạch dưới nhưng không áp dụng cho một dấu gạch dưới duy nhất
Kate Gregory

1
@KateGregory: Tên có dấu gạch dưới hàng đầu được dành riêng để sử dụng cho việc thực hiện tên trong không gian tên toàn cầu. Một dấu gạch dưới hàng đầu theo sau là dấu gạch dưới thứ hai hoặc vốn được dành riêng cho bất kỳ mục đích sử dụng nào (chúng có thể được sử dụng cho các macro khi triển khai). Vì vậy, một dấu gạch dưới hàng đầu theo sau là một chữ cái viết thường có thể ổn trong phạm vi địa phương nhưng tốt nhất nên tránh để tránh vấp ngã và sử dụng tên dành riêng.
Bart van Ingen Schenau 25/03/13

4
@KateGregory: Là một thành viên, _limitkhông phải là một lỗi, mà là một chức năng toàn cầu. Tôi nghĩ tốt hơn là nên có một chính sách đơn giản nói rằng "không sử dụng dấu gạch dưới hàng đầu, không có ngoại lệ" so với chính sách cho phép họ trong một số bối cảnh chứ không phải trong các bối cảnh khác. Nhưng chúng ta có thể đồng ý khác nhau về điều đó. Và để rõ ràng, tôi không có vấn đề gì với dấu gạch dưới ở những nơi khác ngoài lúc ban đầu.
Bart van Ingen Schenau

2
@BartvanIngenSchenau: chỉ vì lợi ích: một chính sách đơn giản như "sử dụng hàng đầu chỉ dành cho các thành viên lớp tư nhân" không nên dẫn đến các vấn đề kỹ thuật, bạn nghĩ sao, điều đó có đúng không?
Doc Brown

1
@KateGregory Chỉ cần làm rõ, tôi đồng ý rằng các quy tắc chính xác hơn những gì tôi đang nói trong câu trả lời của mình; nhưng nó phản ánh sự thiếu chính xác của bộ nhớ của tôi khi tôi cố gắng nhớ chính xác các quy tắc là gì. Vì tôi có xu hướng tránh phải biết các ngoại lệ (không phải tính năng), tôi thích các quy tắc chung dễ thực hiện, đặc biệt đối với các quy tắc không quan trọng như vậy. Điều thú vị là tôi thoải mái hơn với việc di chuyển ngữ nghĩa hơn là ghi nhớ điều này. Có lẽ bây giờ tôi không vui chút nào khi tôi nghĩ về nó ...
Klaim

16

Sử dụng hai dấu gạch dưới chắc chắn là xấu - được dành riêng cho các chi tiết triển khai dành riêng cho trình biên dịch. Điều này không áp dụng cho việc sử dụng một dấu gạch dưới.

Một số người ghét trên dưới. Cho dù bạn gọi một cái gì đó m_indexhay highest_pricehay _a- họ ghét cay ghét đắng nó. Tôi đã làm việc với ai đó 25 năm trước, người đã nói với tôi về một máy in IBM cụ thể (một loại rất phổ biến) phù hợp với nhiều dòng trên trang hơn bằng cách bỏ qua pixel dưới cùng trên mỗi dòng khác. Điều này tốt cho các bản ghi nhớ, hoặc cho đầu ra của một số lượng lớn các số và như vậy, nhưng có tác dụng cho mã làm cho một nửa số dấu gạch dưới của bạn trở nên vô hình. (Vâng, thực sự!) Mọi người trong thế hệ đó thường có sự ghét bỏ không hợp lý, từ sự tương tác với máy in đó hoặc từ việc làm việc với ai đó đánh vào họ mà không được sử dụng dấu gạch dưới.

Hầu hết mọi người tìm cách sử dụng trường hợp hỗn hợp (một tùy chọn chúng tôi không có trong, nói, Fortran) một cách tiếp cận dễ đọc hơn: mIndex, HighestPrice, ađứng lên khá tốt để các ví dụ nhấn mạnh trước đó. Tôi sẽ cung cấp cho bạn hai quy tắc:

  • không bao giờ bắt đầu bất cứ điều gì (hàm, biến, macro, typedef) với hai dấu gạch dưới
  • chọn một quy ước nhất quán (ví dụ: _limitcho các tham số hàm, m_limitcho các biến thành viên, không bao giờ sử dụng dấu gạch dưới, trường hợp lạc đà, viết hoa mỗi từ, tiếng Hungary, một cái gì đó ) và bám vào nó. Đừng bop xung quanh đôi khi với dấu gạch dưới ở đầu, đôi khi là cuối, đôi khi không sử dụng chúng và năm quy ước vỏ khác nhau. Hãy kiên định.

Máy in trong câu hỏi đã qua lâu rồi. Nếu bạn muốn sử dụng một dấu gạch dưới tại thời điểm, hãy thoải mái. Nhưng hãy hiểu, những kẻ ghét gạch dưới vẫn tồn tại.


"Cho dù bạn gọi một cái gì đó m_index hoặc cao_price hoặc _a - họ ghét nó" Không phải không có lý do! Bạn đã không đề cập đến việc có các quy tắc trong các tiêu chuẩn liên quan cụ thể đến việc sử dụng các dấu gạch dưới hàng đầu trong các định danh. Tại sao yêu cầu rắc rối khi nó rất dễ tránh? stackoverflow.com/a/228797
Max Barraclough

không đề cập đến? Đọc câu đầu tiên một lần nữa.
Kate Gregory

"Điều này không áp dụng cho việc sử dụng một dấu gạch dưới" không phải là toàn bộ câu chuyện, hãy xem liên kết của tôi, nói rằng việc dẫn đầu với dấu gạch dưới kép là một điều không rõ ràng, nhưng "Dành riêng trong không gian tên toàn cầu: định danh bắt đầu bằng một gạch dưới ". Tại sao chơi với lửa?
Max Barraclough

1
ok, bạn đang thiếu điểm. Đoạn thứ hai đang thảo luận về sự tồn tại của những người, nói chung, chống gạch dưới. Không dẫn đầu gạch dưới. Tất cả dấu gạch dưới. Vâng, đúng là ngoài quy tắc về hai dấu gạch dưới, còn có một quy tắc về dấu gạch dưới hàng đầu theo sau là chữ in hoa, dẫn đến dấu gạch dưới ở phạm vi toàn cầu, v.v. Và những người đó là những gì tôi muốn gọi sai. Không có lý do dựa trên tiêu chuẩn để phản đối các dấu gạch dưới không rõ ràng. Nhưng dù sao mọi người cũng làm như vậy.
Kate Gregory

Đó là nơi chúng tôi không đồng ý. Có, đôi khi hợp pháp để bắt đầu một định danh với một dấu gạch dưới duy nhất. Như tôi đã nói ở trên, tại sao chơi với lửa? Tôi không bao giờ bắt đầu một định danh với một dấu gạch dưới; Tôi xem nó như một mùi mã (nếu có thể nói là 'xem' một mùi :-P). Bằng cách đó, tôi không bao giờ lo lắng về các chi tiết cụ thể của các quy tắc cho tôi biết chính xác khi nào hợp pháp để làm như vậy.
Max Barraclough
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.