Frage

Sind C-Stil Makronamen unterliegen den gleichen Namensregeln als Bezeichner? Nach einem Compiler-Upgrade wird nun diese Warnung für eine Legacy-Anwendung emittierenden:

warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text
  #define         CHAR_&        38

Diese Codezeile wird definiert, einen ASCII-Wert konstant für ein kaufmännische.

#define   DOL_SN        36
#define   PERCENT       37
#define   CHAR_&        38
#define   RT_SING       39
#define   LF_PAR        40

Ich gehe davon aus, dass diese Definition (nicht wirklich von jedem Code verwiesen wird, soweit ich das beurteilen kann) ist fehlerhaft und soll wie „CHAR_AMPERSAND“?

etwas geändert werden
War es hilfreich?

Lösung

Makronamen sollten nur aus alphanumerischen Zeichen und Unterstrichen, das heißt 'a-z', 'A-Z', '0-9' und '_', und das erste Zeichen sollte keine Ziffer sein. Einige Preprozessoren erlauben auch die Dollarzeichen '$', aber Sie sollten es nicht verwenden; leider kann ich nicht die C-Standard zitieren, da ich es nicht eine Kopie haben.

Aus der GCC Dokumentation :

  

Preprocessing Token fallen in fünf   große Klassen: Identifikatoren,   Vorverarbeitung Zahlen, string   Literale, Interpunktionszeichen und andere. Ein    Kennung ist das gleiche wie ein   Identifikator in C: jede Folge von   Buchstaben, Ziffern oder Unterstreichungen, die   einen Buchstaben oder Unterstrich beginnt mit.   Keywords von C haben keine Bedeutung zu   der Vorprozessor; sie sind gewöhnlich   Identifikatoren. Sie können ein Makro definieren   dessen Name ist ein Schlüsselwort, zum Beispiel.   Die einzige Kennung, die sein kann,   als eine Vorverarbeitung Schlüsselwort   defined. Definierte sehen.

     

Dies ist vor allem gilt für andere Sprachen   der den C-Präprozessor verwenden. Jedoch,   einige der Schlüsselwörter von C ++ sind   signifikant sogar im Preprocessor.   Siehe C ++ Named-Operatoren.

     

In den 1999-C-Standard, Identifikatoren   können Buchstaben enthalten, die nicht sind   der „Zeichensatz Grund source“,   bei der Umsetzung des Ermessens   (Wie akzentuieren lateinische Buchstaben, Griechisch   Buchstaben oder chinesische Schriftzeichen). Diese   kann mit einem erweiterten Zeichen erfolgen   Satz oder die '\u' und '\U' Flucht   Sequenzen. Die Umsetzung dieser   Feature in GCC ist experimentell; eine solche   Zeichen werden nur in dem akzeptierten   '\u' und '\U' Formen und nur dann, wenn   -fextended-identifiers verwendet wird.

     

Als Erweiterung '$' GCC behandelt als   Brief. Dies ist für die Kompatibilität mit   Einige Systeme, wie VMS, wo '$'   üblicherweise verwendet wird, in systemdefinierte   Funktion und Objektnamen. '$' ist nicht   einen Brief, in streng konformen Modus,   oder wenn Sie die -$ Option angeben. Sehen   Invocation.

Andere Tipps

clang erlaubt eine Menge "verrückt" Zeichen .. obwohl ich finden kämpfte jede viel Sinn und Verstand - wie zu Warum einige sind erlaubt, und andere sind nicht . Zum Beispiel ..

#define 💩  ?:          /// WORKS FINE
#define  ■  @end        /// WORKS FINE
#define 🅺  @interface  /// WORKS FINE
#define P  @protocol   /// WORKS FINE

noch

#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.

Wer weiß. ich lieben würde ... aber Google hat mir so ausgefallen ist, so weit. Jeder Einblick zu diesem Thema, würde geschätzt ™ ️.

Du hast Recht, gelten die gleichen Regeln zu Makro und Kennungen, soweit die Namen sind betroffen: gültige Zeichen sind [A-Za-z0-9_].

Es ist verbreiteter Gebrauch Aktivieren Namen zu verwenden Makros aus anderen Kennzeichen zu unterscheiden -. Variablen und Funktionsnamen

Die gleichen Regeln, die gültige Bezeichner für Variablennamen gelten für Makronamen mit Ausnahme angeben, die Makros die gleichen Namen wie Schlüsselwörter haben. Gültige Zeichen in Bezeichnernamen umfassen digits und non-digits und darf nicht mit einer Ziffer beginnen. non-digits umfassen den Großbuchstaben A-Z, die Kleinbuchstaben a-z, den Unterstrich, und alle Zeichen Implementierung definiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top