Che cosa è l'uso di nomi di caratteri universali negli identificatori in C ++

10

Lo standard C ++ (l'ho notato nel nuovo, ma esisteva già in C ++ 03) specifica i nomi dei caratteri universali, scritti come \uNNNN e \UNNNNNNNN e che rappresentano i caratteri con codepoint unicode NNNN /%codice%. Ciò è utile con stringhe letterali, soprattutto perché vengono definiti anche i letterali stringa esplicitamente UTF-8, UTF-16 e UCS-4. Tuttavia, i caratteri letterali universali sono ammessi anche negli identificatori. Qual è la motivazione dietro a questo?

La sintassi è ovviamente totalmente illeggibile, gli identificatori potrebbero essere storpiati per il linker e non è come se ci fosse una funzione standard per recuperare i simboli per nome comunque. Quindi, perché qualcuno dovrebbe effettivamente usare un identificatore con caratteri letterali universali in esso?

Modifica: poiché esisteva già in C ++ 03, la domanda aggiuntiva sarebbe se effettivamente hai visto un codice che lo utilizzava?

    
posta Jan Hudec 25.09.2012 - 16:45
fonte

4 risposte

6

UPDATE - questa risposta, sebbene sembrasse avere senso per me e per gli altri, risulta essere ampiamente sbagliata (e sufficientemente errata rispetto all'intento, da essere effettivamente semplicemente sbagliata). Poiché (come sottolineato in un commento di AProgrammer) è non autorizzato ad usare l'UCS al di fuori delle costanti di stringa quando lo stesso personaggio potrebbe essere rappresentato normalmente nel set di caratteri di base. Quindi, non usarlo per evitare parole chiave, come nel mio esempio; e non utilizzarlo per creare "identificatori" come 23skiddo eseguendo l'escape di 2 . Potrebbe ancora essere usato per rendere i nomi compatibili con le lingue esterne, immagino, ma solo, a quanto pare, quando quei nomi iniziano con una lettera o un carattere esteso e contengono solo lettere, cifre, sottolineatura e caratteri estesi - che sembra troppo restrittivo per supportare adeguatamente quell'intento. Quindi deve essere che l'intento principale sia (come nella risposta di AProgrammer) di consentire questi caratteri extra negli identificatori e abilitare gli editor di sorgenti in cui questi caratteri sono visualizzati graficamente, pur consentendo al file sorgente di essere in ASCII normale.

I programmi C ++ possono chiamare funzioni scritte in altre lingue. È buona norma da parte del comitato di standardizzazione garantire che il C ++ sia interoperabile con altri linguaggi che potrebbero consentire caratteri non alfanumerici o unicode nei nomi di funzioni, anche se tali lingue non esistono ancora. Lo standard non ha bisogno di specificare come funzionerà a livello di linker, ecc; ma è bene avere un meccanismo specifico in atto per consentirlo.

Non è necessario guardare nel futuro per vederne un uso. Supponiamo che abbia una vecchia libreria C con una funzione chiamata catch (o protetta o mutabile) ... e voglio chiamarla da C ++. E per qualsiasi ragione non posso o non voglio modificare il codice C (a proposito, ho più di una volta dovuto occuparmi del vecchio codice C che usava un nome di funzione che era diventato una parola chiave C ++ ...)

Con i nomi UC posso scrivere questo in un'intestazione, e poi chiamare semplicemente 'catch_func ()':

extern "C" {
       int catc\u0068( int a, int b );  // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }

Certo è brutto, ma non importa dal momento che è solo in un posto nell'intestazione. Lo stesso approccio potrebbe essere utilizzato per creare stub per chiamare funzioni in altre lingue e funziona anche se i nomi sono parole chiave o unicode in C ++, oppure hanno spazi, . o altra punteggiatura incorporata in essi

Varie altre lingue hanno dispositivi che consentono la creazione di identificatori che non seguono lo schema generale; per esempio in Verilog, \abcd è un identificatore equivalente a abcd , ma \while e skidoo e .e2 sono anch'essi identificatori, che hanno bisogno del prefisso backslash per essere visto come tale. A causa del modo in cui Verilog viene utilizzato, è importante consentire qualsiasi nome, in cui si riferiscono a interfacce esterne.

    
risposta data 05.09.2014 - 16:28
fonte
4

Consente a un sistema che consente ai caratteri unicode nell'identificatore di esportare l'origine in un formato compilabile su qualsiasi compilatore conforme standard. OSSIA è un modo per codificare unicode rispetto al set di caratteri di base (più o meno come il citato-stampabile è usato per la posta elettronica, i sistemi che sanno meglio sono in grado di fare un lavoro migliore, altri sistemi funzionano ancora).

    
risposta data 26.09.2012 - 11:45
fonte
2

Qualcuno potrebbe voler creare un identificatore usando un carattere di lingua straniera che non è utilizzabile sulla tastiera o sul dispositivo di input. In alternativa, l'identificatore può contenere un carattere che non è stampabile utilizzando il font o le capacità di output del dispositivo, ma l'IDE vuole mostrare una rappresentazione accurata.

    
risposta data 25.09.2012 - 16:49
fonte
1

C ++ richiede che i veri personaggi estesi che appaiono letteralmente nella sorgente si comportino in modo identico con Universal Character Names. L'assegnazione di nomi di caratteri universali negli identificatori consente ai programmatori di utilizzare caratteri estesi negli identificatori.

    
risposta data 16.01.2013 - 23:10
fonte

Leggi altre domande sui tag