Was sind die gültigen Zeichen für Makronamen?

Lesezeit: 4 Minuten

Benutzeravatar von An̲̳̳drew
An̲̳̳ zeichnete

Unterliegen Makronamen im C-Stil denselben Namensregeln wie Bezeichner? Nach einem Compiler-Upgrade gibt es jetzt diese Warnung für eine Legacy-Anwendung aus:

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

Diese Codezeile definiert eine ASCII-Wertkonstante für ein kaufmännisches Und.

#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 (soweit ich das beurteilen kann, von keinem Code tatsächlich referenziert wird) fehlerhaft ist und in etwas wie “CHAR_AMPERSAND” geändert werden sollte?

  • Für alle, die darüber stolpern: Sie können ASCII-Werte von Zeichen in C erhalten, indem Sie einfache Anführungszeichen verwenden: '$', '%', '&'offensichtlich Dinge wie '&'+1 und '&'+2 funktioniert auch (:

    – sij

    10. Dezember 2020 um 20:22 Uhr

Makronamen sollten nur aus alphanumerischen Zeichen und Unterstrichen bestehen, dh 'a-z', 'A-Z', '0-9'und '_', und das erste Zeichen sollte keine Ziffer sein. Einige Präprozessoren erlauben auch das Dollarzeichen '$', aber Sie sollten es nicht verwenden; Leider kann ich den C-Standard nicht zitieren, da ich keine Kopie davon habe.

Von dem GCC-Dokumentation:

Vorverarbeitungstoken fallen in fünf große Klassen: Bezeichner, Vorverarbeitungszahlen, Zeichenfolgenliterale, Interpunktionszeichen und andere. Ein
Kennung ist dasselbe wie ein Bezeichner in C: jede Folge von Buchstaben, Ziffern oder Unterstrichen, die mit einem Buchstaben oder Unterstrich beginnt. Schlüsselwörter von C haben für den Präprozessor keine Bedeutung; sie sind gewöhnliche Identifikatoren. Sie können beispielsweise ein Makro definieren, dessen Name ein Schlüsselwort ist. Der einzige Bezeichner, der als Vorverarbeitungsschlüsselwort betrachtet werden kann, ist
defined. Siehe Definiert.

Dies gilt hauptsächlich für andere Sprachen, die den C-Präprozessor verwenden. Einige Schlüsselwörter von C++ sind jedoch sogar im Präprozessor von Bedeutung. Siehe Benannte C++-Operatoren.

Im C-Standard von 1999 können Bezeichner nach Ermessen der Implementierung Buchstaben enthalten, die nicht Teil des „grundlegenden Quellzeichensatzes“ sind (z. B. akzentuierte lateinische Buchstaben, griechische Buchstaben oder chinesische Ideogramme). Dies kann mit einem erweiterten Zeichensatz oder dem erfolgen '\u' und '\U' Fluchtsequenzen. Die Implementierung dieser Funktion in GCC ist experimentell; solche Zeichen werden nur in akzeptiert
'\u' und '\U' Formen und nur wenn
-fextended-identifiers wird genutzt.

Als Erweiterung behandelt GCC '$' als Brief. Dies dient der Kompatibilität mit einigen Systemen, wie z. B. VMS, wo '$'
wird häufig in systemdefinierten Funktions- und Objektnamen verwendet. '$' ist kein Buchstabe im streng konformen Modus, oder wenn Sie die angeben -$ Möglichkeit. Siehe Aufruf.

  • ISO/IEC 9899:TC3 6.10/1 legt die Grammatik von Vorverarbeitungsanweisungen fest und macht deutlich, dass Makronamen genau die gleichen Regeln wie Bezeichner haben. 6.4.2.1/1 legt die Regeln für Identifikatoren fest.

    – saffsd

    21. Juni 2011 um 5:30 Uhr


clang erlaubt viele “verrückte” Zeichen … obwohl ich mich bemüht habe, sie zu finden irgendein viel Reim oder Grund – als zu warum etwas sind erlaubt, und andere sind es 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 würde gerne … aber Google hat mich damit bisher im Stich gelassen. Jeder Einblick in das Thema wäre willkommen™️.

  • Werfen Sie einen Blick in die Clang-Dokumentation. Oder wenn es nicht einmal dokumentiert ist, überprüfen Sie seinen Quellcode darauf, da es Open Source ist. Aber nach C-Standard kann ich Ihnen sagen, dass alle ungültig sind. und deshalb, da es nicht nach irgendwelchen umgebungsbezogenen Anforderungen gefragt wird, sondern nach einfachem C. Dies ist also noch passender als separate Frage als Antwort und sollte wahrscheinlich sogar als solche gekennzeichnet werden. … Sogar ein ziemlich guter. Ich werde das fragen, wenn du es nicht tust.

    – dhein

    16. Dezember 2015 um 15:07 Uhr


  • @Zaibis check out Was ist eine „gültige“ C-Kennung?

    – Alex Grey

    16. Dezember 2015 um 18:04 Uhr

Sie haben Recht, für Makros und Bezeichner gelten die gleichen Regeln, was die Namen betrifft: gültige Zeichen sind [A-Za-z0-9_].

Es ist üblich, Namen in GROSSBUCHSTABEN zu verwenden, um Makros von anderen Bezeichnern zu unterscheiden – Variablen und Funktionsnamen.

Für Makronamen gelten die gleichen Regeln, die gültige Bezeichner für Variablennamen angeben, mit der Ausnahme, dass Makros dieselben Namen wie Schlüsselwörter haben können. Gültige Zeichen in Bezeichnernamen umfassen digits und non-digits und darf nicht mit einer Ziffer beginnen. non-digits umfassen die Großbuchstaben AZ, die Kleinbuchstaben az, den Unterstrich und alle implementierungsdefinierten Zeichen.

1409950cookie-checkWas sind die gültigen Zeichen für Makronamen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy