Qualunque #define
risultati nella sostituzione dell'identificatore originale con i token sostitutivi. Se non ci sono token di sostituzione, la sostituzione è vuota:
#define DEF_A "some stuff"
#define DEF_B 42
#define DEF_C
printf("%s is %d\n", DEF_A, DEF_B DEF_C);
espande a:
printf("%s is %d\n", "some stuff", 42);
metto uno spazio tra 42
e )
per indicare il "nulla" che DEF_C
espansa-to, ma almeno in termini di linguaggio, l'output del preprocessore è semplicemente un flusso di token. (I compilatori effettivi in genere consentono di vedere l'output del preprocessore.Qualunque ci sia spazio bianco qui dipende dal preprocessore effettivo. Per GNU cpp, ce n'è uno.)
Come nelle altre risposte finora, è possibile utilizzare #ifdef
per verificare se un identificatore è stato #define
d. Puoi anche scrivere:
#if defined(DEF_C)
per esempio. Questi test sono positivi (vale a dire, l'identificatore è definito da) anche se l'espansione è vuota.
vedere anche questo [link] (http://stackoverflow.com/questions/7594808/what-use-cases-necessitate-define- senza-a-token-string) per le risposte. –