Il preprocessore C opera su "token" e ogni volta che è possibile modificare il significato o l'ambiguità, aggiunge sempre spazi bianchi per preservare il significato.
consideri il tuo esempio,
(B)
non c'è alcuna ambiguità o significato alterare se c'è uno spazio tra (
e )
aggiunto o meno indipendentemente dal valore della macro B
.
Ma non è il caso di
|B|
seconda della macro B
, questo di cui sopra potrebbe essere sia ||
o |something|
. Quindi il preprocessore è costretto ad aggiungere uno spazio bianco per mantenere le regole lessicali di C.
Lo stesso comportamento può essere visto con qualsiasi altro token che potrebbe alterare il significato.Ad esempio,
#define B +
B+
produrrebbe
+ +
anziché
++
per detto motivo.
Tuttavia, questo è solo il preprocessore conforme alle regole lessicali C. GCC ha e supporta un vecchio preprocessore chiamato processore tradizionale che non aggiungerebbe alcun spazio aggiuntivo. Ad esempio, se si chiama preprocessore in modalità tradizionale:
gcc -E -traditional-cpp file.c
poi
#define B
(B)
|B|
prodotti (senza gli spazi)
()
||
fonte
2015-06-13 00:09:03
Probabilmente perché '|' e '' || sono diversi operatori. Spero che qualcuno scriva una risposta con le regole esatte utilizzate da cpp. – hyde
Può essere divertente vedere qualcuno scrivere 'x | valore | SOME_FLAG' e risulta essere 'x || SOME_FLAG', probabilmente è così che non verrà compilato. –
Ma ciò significherebbe che '||' viene trattato come un caso speciale. Questo potrebbe essere evitato * inserendo * sempre spazi, che non sarebbero contro le regole C (eccetto per le concatenazioni macro). – usr2564301