Domanda

Sono C-stile nomi di macro soggetti alle stesse regole di denominazione come identificatori? Dopo un aggiornamento del compilatore, è ora emette questo avvertimento per un'applicazione legacy:

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

Questa riga di codice è la definizione di un valore ASCII costante per una e commerciale.

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

Presumo che questa definizione (in realtà non fa riferimento alcun codice, per quanto posso dire) è bacato e dovrebbe essere cambiato in qualcosa come "CHAR_AMPERSAND"?

È stato utile?

Soluzione

I nomi delle macro dovrebbero consistere solo di caratteri alfanumerici e di sottolineatura, cioè 'a-z', 'A-Z', '0-9' e '_', e il primo carattere non deve essere una cifra. Alcuni preprocessori permettono anche il carattere di segno di dollaro '$', ma non si dovrebbe usarlo; purtroppo non posso citare lo standard C dal momento che non ho una copia di esso.

Dalla documentazione di GCC il :

  

gettoni Preprocessing rientrano in cinque   grandi classi: identificatori,   pre-elaborazione numeri, stringhe   letterali, segni di punteggiatura e altri. Un    identificatore è la stessa di un   identificatore in C: qualsiasi sequenza di   lettere, cifre, o di sottolineatura, che   inizia con una lettera o di sottolineatura.   Parole di C non hanno alcun significato per   il preprocessore; essi sono ordinarie   identificatori. È possibile definire una macro   il cui nome è una parola chiave, per esempio.   L'unico identificatore che può essere   considerato una parola chiave pre-elaborazione è   defined. Vedere Definito.

     

Questo è soprattutto vero per altre lingue   che usa il preprocessore C. Però,   alcune delle parole chiave del C ++ sono   significativa anche nel preprocessore.   Vedere C ++ Operatori Named.

     

Nel 1999, C standard, identificatori   può contenere lettere che non fanno parte   del “carattere set fonte di base”,   a discrezione della realizzazione   (Come ad esempio le lettere accentate latino, greco   lettere o ideogrammi cinesi). Questo   può essere fatto con un carattere esteso   insieme, o il '\u' e '\U' fuga   sequenze. L'attuazione del presente   funzionalità di GCC è sperimentale; come   caratteri sono accettati solo nel   -fextended-identifiers e -$ forme e solo se   <=> viene utilizzato.

     

Come estensione, tratta GCC <=> come   lettera. Questo è per la compatibilità con   alcuni sistemi, come VMS, dove <=>   è comunemente utilizzato nel sistema definito   funzione e oggetto nomi. <=> non è   una lettera in modo strettamente conforme,   o se si specifica l'opzione di <=>. Vedere   Invocazione.

Altri suggerimenti

clang permette un sacco di personaggi "folli" .. anche se ho faticato a trovare qualsiasi molto capo né coda - da perché alcuni sono consentiti, e altri sono non . Per esempio ..

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

ancora

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

chi lo sa. Mi piacerebbe ... ma Google mi ha dunque fallito, finora. Tutta la comprensione in materia, sarebbe apprezzato ™ ️.

Hai ragione, le stesse regole si applicano a macro e identificatori per quanto riguarda i nomi sono interessati: i caratteri validi sono [A-Za-z0-9_].

E 'uso comune utilizzare i nomi capitalizzati, per differenziare le macro provenienti da altri identificatori -. Variabili e nome della funzione

Le stesse regole che specificano identificatori validi per i nomi delle variabili si applicano a nomi di macro con l'eccezione che le macro possono avere gli stessi nomi come parole chiave. I caratteri validi nei nomi degli identificatori includono digits e non-digits e non devono iniziare con una cifra. <=> includono le lettere maiuscole A-Z, le lettere minuscole a-z, la sottolineatura, e qualunque carattere attuazione definito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top