😃 (et autres caractères Unicode) dans les identificateurs non autorisés par g ++

Je suis en train de trouver que je ne peux pas utiliser identifier comme identifiant valide avec g ++ 4.7, même avec l’option -fextended-identifiers activée:

 int main(int argc, const char* argv[]) { const char* 😃 = "I'm very happy"; return 0; } 

main.cpp: 3: 3: erreur: errant ‘\ 360’ dans le programme
main.cpp: 3: 3: erreur: errant ‘\ 237’ dans le programme
main.cpp: 3: 3: erreur: errant ‘\ 230’ dans le programme
main.cpp: 3: 3: erreur: errant ‘\ 203’ dans le programme

Après quelques recherches sur Google, j’ai découvert que les caractères UTF-8 ne sont pas encore pris en charge dans les identificateurs, mais un nom de caractère universel devrait fonctionner. Je convertis donc ma source en:

 int main(int argc, const char* argv[]) { const char* \U0001F603 = "I'm very happy"; return 0; } 

main.cpp: 3: 15: erreur: le caractère universel \ U0001F603 n’est pas valide dans un identifiant

Donc apparemment 😃 n’est pas un identifiant valide. Cependant, la norme autorise spécifiquement les caractères de la plage 10000-1FFFD dans l’Annexe E.1 et ne les interdit pas en tant que caractère initial dans E.2. Mon prochain effort a consisté à voir si d’autres caractères Unicode autorisés fonctionnaient – mais aucun que j’ai essayé de faire. Pas même le personnage de PILE OF POO (💩), toujours aussi important.

Donc, pour des noms de variables significatifs et descriptifs, qu’est-ce qui donne? Est -fextended-identifiers ce que -fextended-identifiers fait ce qu’il annonce ou non? Est-ce seulement pris en charge dans la toute dernière version? Et quel genre de soutien les autres compilateurs ont-ils?

A partir de la version 4.8, gcc ne prend pas en charge les caractères en dehors du BMP utilisé comme identifiant . Cela semble être une ressortingction inutile. De plus, gcc ne supporte qu’un ensemble de caractères très restreint décrit dans ucnid.tab , basé sur C 99 et C ++ 98 (il n’est pas encore mis à jour vers C11 et C ++ 11).

Comme décrit dans le manuel, -fextended-identifiers est expérimental , il a donc plus de chance de ne pas fonctionner comme prévu.


Modifier:

GCC supporte le jeu de caractères C11 à partir de 4.9.0 ( svn r204886 pour être précis). Donc, le deuxième morceau de code d’OP utilisant \U0001F603 fonctionne. Je ne peux toujours pas obtenir le code en utilisant 😃 pour travailler même avec -finput-charset=UTF-8 avec GCC 7 sur https://gcc.godbolt.org (vous pouvez suivre ce rapport de bogue , fourni par @ DanielWolf ).

Pendant ce temps, les deux morceaux de code fonctionnent sur Clang 3.3 sans autre option que -std=c++11 .

Cependant, la norme autorise spécifiquement les caractères de la plage 10000-1FFFD dans l’Annexe E.1 et ne les interdit pas en tant que caractère initial dans E.2.

Une chose à garder à l’esprit est que le fait que le standard C ++ autorise (ou interdit) certaines fonctionnalités ne signifie pas nécessairement que votre compilateur supporte (ou ne supporte pas) cette fonctionnalité.

Ceci est un bogue connu dans GCC: Bug 67224 – Prise en charge de UTF-8 pour les noms d’identifiant dans GCC .

Le rapport de bug date de 2015 et a une discussion assez longue. À un certain moment , il mentionne que “il ne semble pas y avoir une demande suffisante pour cette fonctionnalité, de sorte que les entresockets le financent ou que les volontaires interviennent pour la mettre en œuvre”.

Donc, si vous avez trouvé cette rubrique StackOverflow à la recherche d’une solution, vous pouvez append à la discussion là-bas pour montrer qu’il existe, en fait, une demande.