Est-il (non) possible d’utiliser des caractères spéciaux dans une source C?

D’une manière quelque peu alouette, je voulais utiliser un caractère µ dans un nom de fonction dans un projet C. N’est-ce pas possible? Je reçois des erreurs comme

 error: stray '\302' in program 

J’ai essayé d’append les options:

 -fexec-charset=UTF-8 -finput-charset=UTF-8 

à mon script de construction, mais je ne dois pas comprendre ce que ceux-ci permettent. J’utilise cette version de gcc:

 arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors 6-2017-q2-update) 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437] 

La norme C exige que les implémentations aient les caractères suivants dans le jeu de caractères source:

 AZ az 0-9 ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~ 

ainsi que l’espace, les caractères pour les tabs horizontaux, les tabs verticaux et les sauts de formulaire. Cela nécessite également une méthode d’indication de fin de ligne, bien que cela ne soit pas nécessairement un caractère in-stream (C 2011 [N1570] 5.2.1 3). Les implémentations peuvent étendre ce jeu de caractères et autoriser d’autres caractères dans les identificateurs, mais de telles extensions sont définies par chaque implémentation et non par la norme.

-finput-charset=… ne spécifie pas le jeu de caractères à utiliser pour le jeu de caractères source. Il spécifie le jeu de caractères de l’entrée source, mais cette entrée est traduite en jeu de caractères source de GCC.

Clang semble accepter µ comme identifiant (testé sur macOS et dans l’ explorateur de compilateur ), contrairement à GCC.

Le nom d’une fonction doit inclure uniquement des caractères alphanumériques et des traits de soulignement dans la plupart des implémentations du langage C.

J’ai essayé ce programme (encodé en UTF-8) sur mon Mac sous deux compilateurs différents:

 #include  double π = 3.141592654; int main() { printf("π = %f\n", π); } 

Comme d’autres l’ont signalé, gcc s’est plaint d’un “programme errant”. Mais Clang l’accepta et le compila avec succès. quand je lance le programme résultant, je reçois

 π = 3.141593 

En bout de ligne: Je pense que sa mise en œuvre est définie.