2014-10-30 11 views
5

Questa domanda ha testo unicode che potrebbe non essere visualizzato correttamente in tutti i browser.Non sono consentiti caratteri Unicode/speciali nei nomi di variabili in clang?

clang ora (> 3.3) supporta i caratteri Unicode nei nomi di variabili http://llvm.org/releases/3.3/tools/clang/docs/ReleaseNotes.html#major-new-features.

Tuttavia alcuni caratteri speciali sono ancora vietati.

int main(){ 
    double α = 2.; // alpha, ok! 
    double ∞ = 99999.; // infinity, error 
} 

dando:

error: non-ASCII characters are not allowed outside of literals and identifiers 
     double ∞ = 99999.; 

Qual è la differenza fondamentale tra α (alfa) e (infinty) per clang? Che il primo è unicode e quest'ultimo non è unicode ma allo stesso tempo non è ASCII?

C'è una soluzione alternativa o un'opzione per consentire questo set di caratteri in clang (o BTW in gcc)?

Note: 1) è solo un esempio, ci sono un sacco di personaggi che sono potenzialmente utili ma anche vietata, come o . 2) Non sto chiedendo se è una buona idea, si prega di prenderlo come una domanda tecnica. 3) Sono interessato al compilatore C++ di clang 3.4 in Linux (gcc 4.8.3 non supporta questo). Sto salvando i file sorgente con gedit usando la codifica UTF-8 e la fine della riga Unix/Linux. 4) l'aggiunta di altri normali primi caratteri non aiuta: _∞


Le risposte indicano un NO definitivo. Alcune gamme in effetti non sono consentite né né saranno presto. Per spostare un ulteriore passo avanti verso la follia totale , l'alternativa migliore che ho trovato è stata quella di utilizzare i caratteri che sembrano effettivamente uguali. (Ora, questo posso ammettere che non è una buona idea.) Queste alternative possono essere trovate qui http://shapecatcher.com/. Il risultato (scusate se fa male agli occhi):

// double ∞ = 99999.; // still error 
// double ⧞ = 99999.; // infinity negated still error 
    double ꝏ = 99999.; // letter oo 
    double Ꝏ = 99999.; // letter OO 
// double ⧜ = 99999.; // incomplete infinity still error 

Altre suonerie "alternative" morti menzionati nella domanda che sono nel range consentito: ʃ, .

+0

questi nomi sono una pessima idea. Cosa vuoi ottenere con quello? Una sorta di contest di offuscamento ?? – stefan

+2

@stefan: Presumibilmente, scrivendo un codice simile alla notazione matematica. Non è una cattiva idea se il pubblico previsto è matematico. –

+0

@MikeSeymour Sono un matematico, e lo odio ;-) Ma abbastanza equo .. È comunque non portatile. Questo è il più grande inconveniente di qualsiasi cosa. – stefan

risposta

9

Quindi il documento clang dice (sottolineatura mia):

Questa funzione consente di identificatori contengono alcuni caratteri Unicode, come specificato dal lingua attiva standard di;

Questo è trattato nel draft C++ standardAllegato E, i caratteri consentiti sono i seguenti:

Intervalli E.1 di caratteri consentiti [charname.allowed]

00A8, 00AA, 00AD,

00AF, 00B2-00B5, 00B7-00BA, 00BC-00BE, 00C0-00D6, 00D8-00F6, 00F8-00FF

0100-167F, 1681-180D, 180F-1FFF 200B-200D, 202A-202E, 203F-2040, 2054

2060-206F 2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80 -2FFF

3004-3007, 3021-302F, 3031-303F

3040-D7FF F900-FD3D, FD40-FDCF,

FDF0-FE44, FE47-FFFD

10000-1FFFD , 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD, 60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD, B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD

Il codice per l'infinito 221E non è incluso nella lista.

Per riferimento: questi sono i codici sopra convertiti in caratteri unicode (alcuni potrebbero non essere visualizzati correttamente in tutti i browser/font disponibili).

¨, ª, ­, 

¯, ²-µ, ·-º, ¼-¾, À-Ö, Ø-ö, ø-ÿ 

Ā-ᙿ, ᚁ-᠍, ᠏-῿ ​-‍, ‪-‮, ‿-⁀, ⁔, 

⁠- ⁰-↏, ①-⓿, ❶-➓, Ⰰ-ⷿ, ⺀-⿿ 

〄-〇, 〡-〯, 〱-〿 

぀-퟿ 豈-ﴽ, ﵀-﷏, 

ﷰ-﹄, ﹇-� 

-, -, -, -, -, -, -, -, -, -, -, -, -, - 

non riuscivo a trovare un ampio documento che copre le motivazioni per le gamme scelti anche se N3146: Recommendations for extended identifier characters for C and C++ fa fornisce alcuni dettagli sulle influenze.

+0

Ho usato questo strumento http://rishida.net/tools/conversion/ per convertire i codici nella loro rappresentazione nella risposta, se non ti dispiace. Grazie. – alfC

+0

@alfC approvato modifica –

+0

Conosci il criterio utilizzato per scegliere questi intervalli di caratteri? – alfC

Problemi correlati