Quali sono i caratteri validi per i nomi di macro?
-
21-08-2019 - |
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"?
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.