2011-12-19 198 views
5

我在看google go的運行時源代碼(在https://go.googlecode.com/hg/src/pkg/runtime/),看起來他們爲它們的函數名稱使用了一個特殊字符。 (以https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c爲例)。這是否被主要編譯器接受?這不是ANSI C,是嗎?或者它只是一些宏觀魔法?C中的非ASCII字符

謝謝!

+0

通過查看例子,我剛剛意識到,僅出現運行時和一些其他的名稱之間的符號('運行·cgocall','運行·throw','運行·allm')。 – pmg 2011-12-19 16:23:20

+0

@pmg:它用作名稱空間標識符,我認爲它非常聰明,非常酷,使用起來非常不方便。 – 2011-12-19 16:25:14

+2

嗯,這*看起來是一種非常聰明的方式來模擬ANSI C中的命名空間。希望這些答案可以探索可能的解決辦法,而不僅僅是告訴你這個角色是什麼。 – 2011-12-19 16:26:44

回答

5

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它標準化了。

+0

即使在標識符中?或只在字符串內? – Waneck 2011-12-19 16:44:12

+0

即使在標識符中。查看我剛添加的報價。 – AProgrammer 2011-12-19 16:46:21

+0

Hrm,是的。這讓我覺得微軟的C編譯器無法處理它,因爲他們從來沒有打算過支持C99。 – 2011-12-19 23:07:40

2

你的意思是點嗎?它是來自ISO 8859-1(ISO Latin-1)的字符代碼183 - 它是與格魯吉亞逗號對應(顯然)的擴展ASCII代碼,又名「中間點」。它實際上是一個合法的角色。

+0

它是在ANSI標準中定義的嗎? – Waneck 2011-12-19 16:26:47

+0

@Waneck:在擴展字符集http://ascii-table.com/ansi-codes.php。 ANSI編號183。 – Thomas 2011-12-19 16:29:50

+0

它在utf-8中編碼爲0xC2 0xB7。 – pmg 2011-12-19 16:41:32

1

The C99 Standard「允許」(爲「允許」足夠小的值)「奇怪的字符」

5.1.1.2翻譯階段

1翻譯的語法規則中的優先級被指定的遵循 階段。

  1. 物理源文件的多字節字符被映射,在一種實現中定義 方式,到源字符集(引入新行字符爲 結束線指標)如果需要的話。 Trigraph序列被 替換爲相應的單字符內部表示。
1

使用中間點是在這裏討論:

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

基本上,使用點是不規範的一部分,但也有一些情況下是必要的。引導,運行時或程序集。

+0

我不明白。如何/爲什麼需要引導系統?或許,你是在談論Go語言,而不是這個問題所關聯的C代碼? – 2011-12-19 16:34:03

+0

我認爲這個問題涉及谷歌走的標識符,而不是C標識符。這就是爲什麼他們必須談論引導編譯器。 – Waneck 2011-12-19 16:45:33

+0

我的理解是,因爲已經存在使用中間點的函數,所以Go需要使用cgocall.c中的中間點調用這些函數來調出。 – Derek 2011-12-19 16:53:46