Ecco un semplice programma di po C che mi aveva confuso per un po ':Evitare una doppia possibilità di sostituzione macro in C pre-processore
#include <stdio.h>
#define STR1(x) #x
#define STR(x) STR1(x)
int main(void) {
printf("%s\n", STR(MYDEF));
}
viene stampato solo il valore del #define MYDEF come una stringa, utilizzando la tecnica di defi- nizione a doppia definizione standard.
Compile (su Linux) con gcc -DMYDEF=abc prog.c
esegue il risultato e, non sorprendentemente, stampa "abc".
Ma cambiare il valore gcc -DMYDEF=linux prog.c
e il risultato stampato non è 'linux' ma '1'.
Quindi questo mi ha confuso un po ', ma ovviamente succede perché gcc (su Linux) ha, ho scoperto, un #define incorporato per il nome' linux 'con un valore' 1 ', e il STR (x) la macro finisce espandendo MYDEF in 'linux', quindi linux in '1'.
Nel mio vero programma (che era piuttosto più complesso del piccolo test di cui sopra) ho aggirato questo facendo cose in un modo diverso (probabilmente migliore), ma mi ha lasciato curioso ... c'è una piccola macro semplice tecnica che eviterebbe questa doppia sostituzione e farà stampare il programma 'linux'? So che potrei aggiungere un -U o #undef di linux, ma questo mi sembra un po 'goffo.
Avevo pensato che tutti i #defines incorporati iniziassero con caratteri di sottolineatura (di solito doppi caratteri di sottolineatura), ma immagino di no.
Mi sembra che tu abbia elencato tutte le risposte. – 2501
tranne uno - evitare le macro –
Aggiungere '-Dlinux = linux'. - Questo interromperà il codice che si basa su '#if linux' o simili, ma non romperà il codice che si basa su' #if defined (linux) 'o simili. –