2011-12-19 19 views
5

Szukałem kodu źródłowego runtime google go (na https://go.googlecode.com/hg/src/pkg/runtime/) i wydaje się, że używają one specjalnego znaku dla swoich nazw funkcji, ·. (Wyszukaj przykład pod adresem https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c). Czy jest to akceptowane w przypadku większości kompilatorów? To nie jest ANSI C, prawda? A może to tylko trochę magii makro?Znaki spoza ASCII w C

Dziękujemy!

+0

Patrząc na przykład, po prostu zdałem sobie sprawę, że symbol pojawia się tylko pomiędzy środowiskiem wykonawczym a inną nazwą ('runtime · cgocall',' runtime · throw', 'runtime · allm'). – pmg

+0

@pmg: Jest używany jako identyfikator przestrzeni nazw, który moim zdaniem jest bardzo sprytny, bardzo fajny i bardzo niewygodny w użyciu. –

+2

Hmm, to * robi * wydaje się dość sprytnym sposobem na symulowanie przestrzeni nazw w ANSI C. Mam nadzieję, że odpowiedzi sprawdzą, jakie mogą być jakiekolwiek zastrzeżenia, zamiast po prostu powiedzieć, czym jest ta postać. –

Odpowiedz

5

C90 nie zezwala na dodatkowy znak w identyfikatorze (nad tymi w zestawie znaków podstawowych), C99 do (oba ze składnią znaków uniwersalnych - \ uXXXX i \ UXXXXXXXX - oraz zdefiniowany przez implementację zestaw innych znaków) .

6.4.2.1/1 w 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 

nie wiem jak dobrze jest obsługiwane przez implementacje C, wiem, że Plan9 kompilator C could handle other characters zanim została znormalizowana.

+0

nawet w identyfikatorach? Lub tylko w strunach? – Waneck

+0

Nawet w identyfikatorach. Zobacz ofertę, którą właśnie dodałem. – AProgrammer

+0

Hmm, tak. To sprawia, że ​​myślę, że kompilator C firmy Microsoft też nie może sobie z tym poradzić, ponieważ nigdy nie zadali sobie trudu, aby obsłużyć C99. –

2

Masz na myśli kropkę? Jest to kod znaków 183 z ISO 8859-1 (ISO Latin-1) - jest to rozszerzony kod ASCII odpowiadający (podobno) do przecinka gruzińskiego, znanego też jako "środkowa kropka". W rzeczywistości jest to postać prawna.

+0

Czy jest to zdefiniowane w standardzie ANSI? – Waneck

+0

@Waneck: w rozszerzonym zestawie znaków znajduje się http://ascii-table.com/ansi-codes.php. Numer ANSI 183. – Thomas

+0

Jest kodowany w utf-8 jako 0xC2 0xB7. – pmg

1

The C99 Standard "pozwala" (dla dostatecznie małych wartości "allow")

5.1.1.2 faz Translation "dziwnych bohaterów

1 pierwszeństwo wśród reguł składniowych przekładu jest określona przez po fazach .

  1. fizyczne znaki plik źródłowy wielobajtowe są odwzorowywane, w realizacji określono sposób, do zestawu znaków źródło (wprowadzenie znaków nowej linii do end-of-line wskaźników), jeżeli jest to konieczne. Sekwencje Trigraph zastępowane są przez odpowiadające im jednobarwne reprezentacje wewnętrzne.
1

Korzystanie że środkowa kropka jest omawiany tutaj:

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

Zasadniczo, przy użyciu tego kropka nie jest częścią specyfikacji, ale istnieją pewne przypadki, w których jest to konieczne. Bootstrapping, runtime lub Assembly.

+0

Nie rozumiem. Jak/dlaczego konieczne jest ładowanie systemu? Czy mówisz raczej o języku Go niż o kodzie C powiązanym z pytaniem? –

+0

Myślę, że ten problem dotyczy identyfikatorów google go, a nie C. Dlatego muszą mówić o ładowaniu kompilatora. – Waneck

+0

Sposób, w jaki to rozumiem, polega na tym, że skoro istnieją już funkcje wykorzystujące środkową kropkę, Go musi wykonywać wywołania tych funkcji, używając środkowej kropki w cgocall.c, aby wywołać. – Derek

Powiązane problemy