我在看google go的運行時源代碼(在https://go.googlecode.com/hg/src/pkg/runtime/),看起來他們爲它們的函數名稱使用了一個特殊字符。 (以https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c爲例)。這是否被主要編譯器接受?這不是ANSI C,是嗎?或者它只是一些宏觀魔法?C中的非ASCII字符
謝謝!
我在看google go的運行時源代碼(在https://go.googlecode.com/hg/src/pkg/runtime/),看起來他們爲它們的函數名稱使用了一個特殊字符。 (以https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c爲例)。這是否被主要編譯器接受?這不是ANSI C,是嗎?或者它只是一些宏觀魔法?C中的非ASCII字符
謝謝!
C90不允許在標識符的附加字符(超過那些在基本字符集),C99做(都與通用字符語法 - 爲\ uXXXX和\ UXXXXXXXX - 和一個實現定義的一組的其它字符) 。
在C99 6.4.2.1/1:
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
我不知道它是如何通過良好的C實現的支持,我知道的Plan9 C編譯器could handle other characters它標準化了。
即使在標識符中?或只在字符串內? – Waneck 2011-12-19 16:44:12
即使在標識符中。查看我剛添加的報價。 – AProgrammer 2011-12-19 16:46:21
Hrm,是的。這讓我覺得微軟的C編譯器無法處理它,因爲他們從來沒有打算過支持C99。 – 2011-12-19 23:07:40
The C99 Standard「允許」(爲「允許」足夠小的值)「奇怪的字符」
5.1.1.2翻譯階段
1翻譯的語法規則中的優先級被指定的遵循 階段。
- 物理源文件的多字節字符被映射,在一種實現中定義 方式,到源字符集(引入新行字符爲 結束線指標)如果需要的話。 Trigraph序列被 替換爲相應的單字符內部表示。
使用中間點是在這裏討論:
http://code.google.com/p/go/issues/detail?id=793
基本上,使用點是不規範的一部分,但也有一些情況下是必要的。引導,運行時或程序集。
通過查看例子,我剛剛意識到,僅出現運行時和一些其他的名稱之間的符號('運行·cgocall','運行·throw','運行·allm')。 – pmg 2011-12-19 16:23:20
@pmg:它用作名稱空間標識符,我認爲它非常聰明,非常酷,使用起來非常不方便。 – 2011-12-19 16:25:14
嗯,這*看起來是一種非常聰明的方式來模擬ANSI C中的命名空間。希望這些答案可以探索可能的解決辦法,而不僅僅是告訴你這個角色是什麼。 – 2011-12-19 16:26:44