Was sind die gültigen Zeichen für Makronamen?
-
21-08-2019 - |
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 werdenLö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.