2011-12-19 12 views
5

stavo guardando google codice sorgente runtime vanno di (a https://go.googlecode.com/hg/src/pkg/runtime/), e sembra che usano un carattere speciale per i loro nomi di funzione, ·. (Guarda ad esempio a https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c). Questo è accettato tra i principali compilatori? Non è ANSI C, vero? O è solo un po 'di magia macro?caratteri non ASCII in C

Grazie!

+0

Osservando l'esempio, ho appena realizzato che il simbolo appare solo tra il runtime e qualche altro nome ('runtime · cgocall',' runtime · throw', 'runtime · allm'). – pmg

+0

@ pmg: è usato come identificatore di namespace, che ritengo sia molto intelligente, molto interessante e molto scomodo da usare. –

+2

Hmm, questa * non * sembra essere piuttosto un modo intelligente di simulare spazi dei nomi in ANSI C. Speriamo che le risposte esplorare quello che potrebbe essere qualsiasi caveat per farlo, piuttosto che solo dicendo quello che il personaggio è. –

risposta

5

C90 non consente carattere aggiuntivo a identificatore (su quelle dei personaggi di base set), C99 fare (sia con la sintassi carattere universale - \ uXXXX e \ UXXXXXXXX - e un insieme definito implementazione di altri personaggi) .

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

non so quanto bene è supportato da C implementazioni, so che Plan9 compilatore C could handle other characters prima che fosse standardizzato.

+0

anche negli identificatori? O solo dentro le stringhe? – Waneck

+0

Anche negli identificatori. Vedi la citazione che ho appena aggiunto. – AProgrammer

+0

Hrm, si. Questo mi fa pensare che neanche il compilatore C di Microsoft può gestirlo, dal momento che non si sono mai presi la briga di supportare C99. –

2

Vuoi dire il punto? È il codice carattere 183 di ISO 8859-1 (ISO Latin-1) - è un codice ASCII esteso corrispondente (apparentemente) alla virgola georgiana, ovvero "punto centrale". In realtà è un personaggio legale.

+0

E' definito nello standard ANSI? – Waneck

+0

@Waneck: è, nel set di caratteri esteso, http://ascii-table.com/ansi-codes.php. ANSI numero 183. – Thomas

+0

È codificato in utf-8 come 0xC2 0xB7. – pmg

1

The C99 Standard "permette" (per sufficientemente piccoli valori di "consentire")

5.1.1.2 fasi di traduzione 'strani personaggi

1 La precedenza tra le regole sintattiche della traduzione è specificato dal seguenti fasi .

  1. caratteri fisici sorgente più byte vengono mappati, in un'implementazione definiti modo, il set di caratteri sorgente (introducendo caratteri di nuova riga per indicatori di fine linea), se necessario. Le sequenze di Trigraph sono sostituite da corrispondenti rappresentazioni interne a singolo carattere.
1

Utilizzando tale punto centrale è discusso qui:

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

Fondamentalmente, utilizzando tale punto non fa parte della specifica, ma ci sono alcuni casi in cui è necessario. Bootstrap, runtime o assembly.

+0

Non capisco. Come/perché è necessario eseguire il bootstrap del sistema? Stai parlando della lingua Go, forse, piuttosto che del codice C collegato alla domanda? –

+0

Penso che questo problema si riferisca agli identificatori di google go, non agli identificativi C. Ecco perché devono parlare del bootstrap del compilatore. – Waneck

+0

Il modo in cui ho capito è che poiché esistono già funzioni che utilizzano il punto centrale, Go deve effettuare chiamate a tali funzioni utilizzando quel punto centrale in cgocall.c per richiamare. – Derek