2011-12-19 35 views
5

Tôi đang xem mã nguồn thời gian chạy của google go (tại https://go.googlecode.com/hg/src/pkg/runtime/), và có vẻ như chúng sử dụng một ký tự đặc biệt cho tên hàm của chúng, ·. (Hãy xem ví dụ tại https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c). Điều này có được chấp nhận trên các trình biên dịch chính không? Nó không phải là ANSI C, phải không? Hay nó chỉ là ma thuật vĩ mô?Các ký tự không phải ASCII trong C

Cảm ơn bạn!

+0

Bằng cách xem ví dụ, tôi vừa nhận ra rằng biểu tượng chỉ xuất hiện giữa thời gian chạy và một số tên khác ('thời gian chạy · cgocall',' thời gian chạy · throw', 'thời gian chạy · allm'). – pmg

+0

@pmg: Nó được sử dụng như một định danh không gian tên, mà tôi nghĩ là rất thông minh, rất mát mẻ và rất bất tiện khi sử dụng. –

+2

Hmm, * này * có vẻ là một cách khá thông minh để mô phỏng các không gian tên trong ANSI C. Hy vọng rằng các câu trả lời khám phá những gì có thể là bất kỳ sự cẩn thận để làm như vậy, thay vì chỉ cho bạn biết nhân vật là gì. –

Trả lời

5

C90 không cho phép ký tự bổ sung trong mã định danh (trong ký tự cơ bản), C99 làm (cả hai với cú pháp ký tự chung - \ uXXXX và \ UXXXXXXXX - và tập hợp các ký tự khác được xác định) .

6.4.2.1/1 trong C99:

identifier: 
    identifier-nondigit 
    identifier identifier-nondigit 
    identifier digit 
identifier-nondigit: 
    nondigit 
    universal-character-name 
    other implementation-defined characters 
nondigit: one of 
    _ a b c d e f g h i j k l m 
    n o p q r s t u v w x y z 
    A B C D E F G H I J K L M 
    N O P Q R S T U V W X Y Z 
digit: one of 
    0 1 2 3 4 5 6 7 8 9 

Tôi không biết như thế nào nó được hỗ trợ bởi việc triển khai C, tôi biết rằng Plan9 C biên dịch could handle other characters trước khi nó được chuẩn hóa.

+0

ngay cả trong số nhận dạng? Hoặc chỉ bên trong dây? – Waneck

+0

Ngay cả trong số nhận dạng. Xem báo tôi vừa thêm. – AProgrammer

+0

Hrm, vâng. Điều này làm cho tôi nghĩ rằng trình biên dịch C của Microsoft không thể xử lý nó, hoặc, vì họ chưa bao giờ bận tâm để hỗ trợ C99. –

2

Bạn có ý là dấu chấm không? Đó là mã ký tự 183 từ ISO 8859-1 (ISO Latin-1) - đó là mã ASCII mở rộng tương ứng (rõ ràng) với dấu phẩy Georgia, còn gọi là "dấu chấm giữa". Nó thực sự là một nhân vật hợp pháp.

+0

Được định nghĩa trong tiêu chuẩn ANSI? – Waneck

+0

@Waneck: trong bộ ký tự mở rộng, http://ascii-table.com/ansi-codes.php. ANSI số 183. – Thomas

+0

Nó được mã hóa trong utf-8 là 0xC2 0xB7. – pmg

1

The C99 Standard "cho phép" (đối với các giá trị đủ nhỏ "cho phép")

5.1.1.2 giai đoạn dịch của nhân vật lạ '

1 ưu tiên giữa các quy tắc cú pháp của bản dịch được xác định bởi các theo sau giai đoạn.

  1. ký tự file nguồn multibyte vật lý được ánh xạ, trong thực hiện quy định cách, để các bộ ký tự nguồn (giới thiệu nhân vật mới-line cho chỉ số end-of-line) nếu cần thiết. Các chuỗi Trigraph được thay thế bằng các biểu diễn bên trong một ký tự tương ứng.
1

Sử dụng mà chấm ở giữa được thảo luận ở đây:

http://code.google.com/p/go/issues/detail?id=793

Về cơ bản, sử dụng dấu chấm đó không phải là một phần của spec, nhưng có một số trường hợp nó là cần thiết. Bootstrapping, thời gian chạy, hoặc lắp ráp.

+0

Tôi không hiểu. Làm thế nào/tại sao nó cần thiết để khởi động hệ thống? Bạn đang nói về ngôn ngữ Go, có lẽ, chứ không phải là mã C liên quan đến bởi câu hỏi? –

+0

Tôi cho rằng vấn đề này liên quan đến số nhận dạng của google go, không phải định danh C. Đó là lý do tại sao họ phải nói về bootstrapping trình biên dịch. – Waneck

+0

Cách tôi hiểu nó là vì đã tồn tại các chức năng sử dụng dấu chấm giữa, Go cần thực hiện cuộc gọi đến các hàm đó bằng cách sử dụng dấu chấm giữa đó trong cgocall.c để gọi ra. – Derek

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