Les noms de macro de style C sont-ils soumis aux mêmes règles de dénomination que les identificateurs? Après une mise à niveau du compilateur, il émet maintenant cet avertissement pour une application héritée:
warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text
#define CHAR_& 38
Cette ligne de code définit une constante de valeur ASCII pour une esperluette.
#define DOL_SN 36
#define PERCENT 37
#define CHAR_& 38
#define RT_SING 39
#define LF_PAR 40
Je suppose que cette définition (non référencée par aucun code, pour autant que je sache) est boguée et devrait être changée en quelque chose comme "CHAR_AMPERSAND"?
Les noms de macro ne doivent être composés que de caractères alphanumériques et de traits de soulignement, c'est-à-dire 'a-z'
, 'A-Z'
, '0-9'
, et '_'
, et le premier caractère ne doit pas être un chiffre. Certains préprocesseurs autorisent également le caractère de signe dollar '$'
, mais vous ne devez pas l'utiliser; malheureusement je ne peux pas citer la norme C car je n'en ai pas de copie.
De la documentation GCC :
Les jetons de prétraitement se répartissent en cinq grandes classes: identifiants, numéros de prétraitement, littéraux de chaîne, signes de ponctuation et autres. Un identifiant est identique à un identifiant en C: toute séquence de lettres, chiffres ou traits de soulignement, qui commence par une lettre ou un trait de soulignement. Les mots clés de C n'ont aucune signification pour le préprocesseur; ce sont des identifiants ordinaires. Vous pouvez définir une macro dont le nom est un mot-clé, par exemple. Le seul identifiant pouvant être considéré comme un mot clé de prétraitement est
defined
. Voir Défini.Cela est principalement vrai pour les autres langages qui utilisent le préprocesseur C. Cependant, quelques mots clés de C++ sont significatifs même dans le préprocesseur. Voir Opérateurs nommés C++.
Dans la norme C de 1999, les identificateurs peuvent contenir des lettres qui ne font pas partie du "jeu de caractères source de base", à la discrétion de l'implémentation (telles que les lettres latines accentuées, les lettres grecques ou les idéogrammes chinois). Cela peut être fait avec un jeu de caractères étendu, ou le
'\u'
et'\U'
Séquences d'échappement. L'implémentation de cette fonctionnalité dans GCC est expérimentale; ces caractères ne sont acceptés que dans le'\u'
et'\U'
formes et seulement si-fextended-identifiers
est utilisé.En tant qu'extension, GCC traite
'$'
sous forme de lettre. C'est pour la compatibilité avec certains systèmes, tels que VMS, où'$'
est couramment utilisé dans les noms de fonction et d'objet définis par le système.'$'
n'est pas une lettre en mode strictement conforme, ou si vous spécifiez-$
option. Voir Invocation.
clang
autorise beaucoup de personnages "fous" .. même si j'ai du mal à trouver tout beaucoup de rimes ou de raisons - quant à pourquoi certains sont autorisés, et d'autres sont pas. Par exemple..
#define ???? ?: /// WORKS FINE
#define ■ @end /// WORKS FINE
#define ???? @interface /// WORKS FINE
#define P @protocol /// WORKS FINE
encore
#define ☎ TEL /// ERROR: Macro name must be an identifier.
#define ❌ NO /// ERROR: Macro name must be an identifier.
#define ⇧ UP /// ERROR: Macro name must be an identifier.
#define 〓 == /// ERROR: Macro name must be an identifier.
#define ???? Apple /// ERROR: Macro name must be an identifier.
Qui sait. J'adorerais ... mais Google m'a donc échoué jusqu'à présent. Toute idée sur le sujet serait appréciée ™ ️.
Vous avez raison, les mêmes règles s'appliquent aux macros et identifiants en ce qui concerne les noms: les caractères valides sont [A-Za-z0-9_].
Il est courant d'utiliser des noms CAPITALISÉS pour différencier les macros des autres identifiants - variables et nom de fonction.
Les mêmes règles qui spécifient des identificateurs valides pour les noms de variables s'appliquent aux noms de macro, à l'exception que les macros peuvent avoir les mêmes noms que les mots-clés. Les caractères valides dans les noms d'identificateurs incluent digits
et non-digits
et ne doit pas commencer par un chiffre. non-digits
inclut les lettres majuscules A-Z, les lettres minuscules a-z, le trait de soulignement et tout caractère défini par l'implémentation.