web-dev-qa-db-fra.com

Quels sont les caractères valides pour les noms de macro?

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"?

43
An̲̳̳drew

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.

38
Adam Rosenfield

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 ™ ️.

11
Alex Gray

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.

8
philant

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.

1
Robert Gamble