Ovviamente, avere il compilatore che incontra il carattere @
causerà un errore di sintassi (a meno che non si tratti di un commento o di una stringa letterale). Tuttavia, se il personaggio viene trovato ad es. all'interno di un blocco #if 0
, il programma è tecnicamente valido?Il carattere @ è consentito nell'origine C?
ho provato questo:
#define NOTHING(x)
int main()
{
NOTHING(@@@@);
return 0;
}
con -pedantic -Wall -Wextra
, sia gcc e clang e ha dato nessun avviso. Non sono sicuro che sia garantito che funzioni, o se semplicemente non hanno un avvertimento specifico per questo.
Non ho trovato nulla nello standard che dice in un modo o nell'altro, il che è preoccupante. Non voglio basare uno strumento su questo solo per scoprire che un compilatore conforme allo standard si soffoca su di esso.
"@ è un preprocessore di token valida" - questa è la chiave qui, e la sezione relativa norma sembra essere [sezione C11 6.4] (http://port70.net/~nsz/c/c11/n1570.html#6.4), dove la definizione di 'preprocessing-token' include qualsiasi carattere non di spazi bianchi che non corrisponde alle altre categorie di token di preelaborazione. – user2357112
Grazie! Questo risponde completamente alla mia domanda. – mtijanic