Việc sử dụng tên nhân vật phổ quát trong định danh trong C ++ là gì


11

Chuẩn C ++ (Tôi nhận thấy nó trong một hình mới, nhưng nó đã tồn tại trong C ++ 03) quy định cụ thể tên nhân vật phổ biến, viết như sau \uNNNN\UNNNNNNNNvà đại diện cho các nhân vật với codepoints unicode NNNN/ NNNNNNNN. Điều này rất hữu ích với các chuỗi ký tự chuỗi, đặc biệt là vì các chuỗi ký tự chuỗi UTF-8, UTF-16 và UCS-4 cũng được xác định rõ ràng. Tuy nhiên, các ký tự phổ quát cũng được cho phép trong định danh. Động lực đằng sau đó là gì?

Cú pháp rõ ràng là hoàn toàn không thể đọc được, các định danh có thể được đọc sai cho trình liên kết và không giống như có bất kỳ chức năng tiêu chuẩn nào để truy xuất các ký hiệu theo tên. Vậy tại sao mọi người thực sự sẽ sử dụng một định danh với các ký tự phổ quát trong đó?

Chỉnh sửa: Vì nó thực sự đã tồn tại trong C ++ 03 rồi, câu hỏi bổ sung sẽ là liệu bạn có thực sự thấy một mã đã sử dụng nó không?

Câu trả lời:


6

CẬP NHẬT - câu trả lời này, mặc dù nó có vẻ có ý nghĩa đối với tôi và những người khác, nhưng hóa ra phần lớn là sai (và đủ sai về ý định, vì thực sự chỉ là sai hoàn toàn). Vì (như được chỉ ra trong một nhận xét của AProgrammer), không được phép sử dụng UCS bên ngoài các hằng chuỗi khi cùng một ký tự có thể được biểu diễn bình thường trong bộ ký tự cơ sở. Vì vậy, không sử dụng nó để thoát khỏi các từ khóa, như trong ví dụ của tôi; và không sử dụng nó để tạo 'định danh' như thế nào 23skiddobằng cách thoát khỏi2. Tôi đoán nó vẫn có thể được sử dụng để làm cho tên tương thích với các ngôn ngữ bên ngoài, nhưng chỉ, dường như, khi những tên đó bắt đầu bằng một chữ cái hoặc ký tự mở rộng và chỉ chứa các chữ cái, chữ số, gạch chân và ký tự mở rộng - mà Có vẻ như quá hạn chế để hỗ trợ đúng ý định đó. Vì vậy, mục đích chính là (như trong câu trả lời của AProgrammer) là cho phép các ký tự phụ này trong mã định danh và để cho phép các trình soạn thảo nguồn trong đó các ký tự này được hiển thị bằng đồ họa, trong khi vẫn cho phép tệp nguồn ở dạng ASCII đơn giản.


Các chương trình C ++ có thể gọi các hàm được viết bằng các ngôn ngữ khác. Đó là một chiến lược tốt trong một phần của ủy ban tiêu chuẩn hóa để đảm bảo rằng C ++ sẽ tương thích với các ngôn ngữ khác có thể cho phép các ký tự không chữ và số trong các tên hàm, ngay cả khi các ngôn ngữ đó chưa tồn tại. Tiêu chuẩn không cần xác định cách thức hoạt động ở cấp liên kết, v.v; nhưng thật tốt khi có một cơ chế xác định để cho phép nó.

Bạn không cần nhìn vào tương lai để thấy được cách sử dụng này. Giả sử tôi có một thư viện C cũ có chức năng được gọi là catch(hoặc được bảo vệ hoặc có thể thay đổi) ... và tôi muốn gọi nó từ C ++. Và vì bất kỳ lý do gì tôi không thể hoặc không muốn sửa đổi mã C (Nhân tiện, tôi đã hơn một lần phải xử lý mã C cũ sử dụng tên hàm đã trở thành từ khóa C ++ ...)

Với tên UC, tôi có thể viết cái này trong một tiêu đề, và sau đó chỉ cần gọi 'Catch_func ()':

extern "C" {
       int catc\u0068( int a, int b );  // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }

Chắc chắn nó xấu, nhưng nó không thành vấn đề vì nó chỉ ở một nơi trong tiêu đề. Cách tiếp cận tương tự có thể được sử dụng để tạo ra các sơ khai để gọi các hàm trong các ngôn ngữ khác và hoạt động ngay cả khi tên là từ khóa C ++ hoặc unicode, hoặc có dấu cách .hoặc dấu chấm câu khác được nhúng trong chúng

Nhiều ngôn ngữ khác có các thiết bị cho phép tạo các số nhận dạng không tuân theo mẫu chung; ví dụ trong Verilog, \abcdlà một mã định danh tương đương abcd, nhưng \while\23skidoocũng \44.e2là các mã định danh, cần có tiền tố dấu gạch chéo ngược để được nhìn thấy như vậy. Do cách thức sử dụng Verilog, điều quan trọng là cho phép mọi tên gọi, nơi chúng liên quan đến các giao diện bên ngoài.


Trường hợp sử dụng thú vị. Mặc dù tôi nghi ngờ (khi có thể) sẽ tốt hơn nếu viết một tệp C nhỏ để dịch tên (và do đó có thể sử dụng mã định danh C ++) và có chức năng gọi C ++ đó.
Thomas Eding

1
Bạn không thể viết rằng vì hai lý do, UCS đầu tiên bên ngoài chuỗi ký tự và ký tự không thể đề cập đến ký tự trong các bộ cơ bản mà không làm cho chương trình bị sai lệch, thứ hai nếu mệnh đề đó không có mặt UCS được xử lý trong giai đoạn 1 của bản dịch và do đó, sẽ không có sự khác biệt trong việc xử lý giữa UCS tham chiếu đến một ký tự trong tập cơ bản và chính ký tự đó.
Lập trình viên

4

Nó cho phép một hệ thống cho phép các ký tự unicode trong mã định danh xuất nguồn theo định dạng có thể biên dịch được trên bất kỳ trình biên dịch tuân thủ tiêu chuẩn nào. IE là một cách để mã hóa unicode trên bộ ký tự cơ bản (ít nhiều giống như trích dẫn - có thể in được sử dụng cho email, các hệ thống biết rõ hơn có thể thực hiện công việc tốt hơn, các hệ thống khác vẫn hoạt động tốt).


2

Ai đó có thể muốn tạo một mã định danh bằng ký tự tiếng nước ngoài không thể nhập trên bàn phím hoặc thiết bị đầu vào. Ngoài ra, mã định danh có thể chứa một ký tự không thể in được bằng cách sử dụng phông chữ hoặc khả năng đầu ra của thiết bị nhưng IDE muốn hiển thị một đại diện chính xác.


4
Trong trường hợp đầu tiên, mã định danh sẽ trông giống như có ký tự đó, vì vậy mã sẽ không thể đọc được và mã định danh không thực sự quan trọng đối với máy. Và thứ hai, đại diện trong IDE là một vấn đề hoàn toàn riêng biệt.
Jan Hudec

1

C ++ yêu cầu các ký tự mở rộng thực tế xuất hiện theo nghĩa đen trong nguồn hoạt động giống hệt với Tên nhân vật phổ quát. Cho phép Tên nhân vật phổ quát trong mã định danh cho phép lập trình viên sử dụng các ký tự mở rộng trong mã định danh.


Nó thực sự mở rộng các ký tự được hỗ trợ, chúng phải hoạt động như các ký tự phổ quát tương ứng. Nhưng họ không cần phải được hỗ trợ.
Jan Hudec

1
Điều đó đúng nhưng có một điểm sai, đó là nếu ủy ban muốn chỉ định rằng việc triển khai hỗ trợ các ký tự mở rộng nên hỗ trợ sử dụng các ký tự đó trong mã định danh thì điều đó đòi hỏi phải có UCN trong mã định danh. Các UCN được cho phép trong các mã định danh, không nhất thiết là vì nó rất dễ đọc và mọi người đều thích mã hóa thủ công theo tên thập lục phân, nhưng vì nếu thông số kỹ thuật muốn cho phép các ký tự mở rộng được sử dụng trong mã định danh thì nó sẽ làm như vậy bằng cách chỉ định rằng UCN được phép trong mã định danh.
bames53
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.