Những lý do không nên
Thứ nhất, đây là một lý do không viết bất kỳ dấu gạch dưới hoặc sử dụng bất kỳ thủ thuật nào để mô phỏng nó: nó làm cho các hằng số khó tìm thấy hơn trong mã. Giả sử rằng một số chương trình trưng bày, ở đâu đó trong hoạt động của nó, giá trị mã hóa cứng 1500000 cho một số tham số. Tôi muốn biết nơi mã nguồn của chương trình này thực sự xảy ra, vì vậy tôi grep mã cho 1500000
và không tìm thấy gì. Tại sao? Có thể nó ở dạng thập lục phân (nhưng tại sao lại có số thập phân tròn như vậy). Không biết với tôi, hằng số thực sự được viết là 1_500_000
. Tôi cần regex 1_?500_?000
.
Nhân vật hướng dẫn trong bình luận
Chỉ vì một loại hỗ trợ trực quan không có sẵn hoặc chúng tôi không muốn sử dụng nó vì lý do trên, không có nghĩa là chúng tôi không thể tận dụng hai chiều của tệp văn bản để tạo một trợ giúp trực quan thay thế:
foo = bar / 1000000000;
// --^--^--^
Với điều này, chúng ta có thể dễ dàng thuyết phục bản thân rằng có ba nhóm ba số không. Tuy nhiên, chúng ta vẫn có thể grep mã nguồn 1000000000
và tìm nó.
Cú pháp tô màu
Một trình soạn thảo văn bản với màu cú pháp có thể lập trình có thể được thực hiện cho các nhóm màu chữ số trong các hằng số với các màu xen kẽ để dễ đọc hơn. Chúng ta không phải làm bất cứ điều gì trong mã.
Tiền xử lý: C, C ++, Mục tiêu C
Bây giờ, nếu chúng ta thực sự muốn một số dấu phẩy giữa các chữ số, trong C và C ++, chúng ta có thể sử dụng một số tiền xử lý:
/* Four digit base TH-ousand constant macro */
/* Condensed using Horner's rule */
#define TH(A,B,C,D) ((((((A) * 1000) + (B)) * 1000) + (C)) * 1000 + D)
tv_sec = nanoseconds / TH(1,000,000,000)
Hoạt động cho số như TH(1,234,567,890)
.
Một macro tương tự TH cũng có thể hoạt động với việc dán mã thông báo thay vì số học. Trong bộ tiền xử lý C, ##
toán tử nhị phân ("dán mã thông báo") có thể được sử dụng trong phần thân macro để dán hai toán hạng vào một mã thông báo. Một hoặc cả hai toán hạng có thể là đối số macro. Nhược điểm ở đây (tạo ra rủi ro cho chúng tôi) là nếu catenation kết quả không phải là mã thông báo hợp lệ, hành vi không được xác định.
#define TOK4(A, B, C, D) A ## B ## C ## D
Hiện nay
TOK4(1,000,000,000) /* produces the single token 1000000000 */
TOK4(1,123,000,000.0E+2) /* produces the single token 1123000000.0E+2 */
TOK4(pr,in,t,f) /* produces the token printf */
TOK4(#,*,a,b) /* undefined behavior, #*ab is not valid token syntax */
Các chương trình C dán các mã định danh lại với nhau và sử dụng các kết quả để đặt tên cho các biến và hàm toàn cục tồn tại và rất tệ khi làm việc vì chúng không phù hợp với các công cụ như GNU id-utils và ctags.