Sto utilizzando gcc (in particolare avr-gcc).Come posso ottenere il preprocessore gcc per verificare se un'espressione valuta un valore o nulla?
Quindi questo è il mio dilemma:
Diciamo che ho questi definita da qualche parte:
#define THING_0_A 0
#define THING_0_B 1
#define THING_1_A 0
Poi, in un secondo file ho questo:
#define CONCAT_(A,B,C) A ## B ## C
#define CONCAT(A,B,C) CONCAT_(A,B,C)
#define ID 0
#define THING_N(A) CONCAT(THING_,ID,A)
Con questo ora ho una selezione di espressioni (sempre nel secondo file):
THING_N(_A) // evaluates to 0
THING_N(_B) // evaluates to 1
THING_N(_C) // evaluates to... nothing? Or undefined? Or THING_0_C?
Ora, quello che sto cercando di capire è come fare questo (anche ancora nel secondo file):
#ifdef THING_N(_A)
// Do something knowing that THING_N(_A) is defined (in this case THING_0_A)
#endif
Oppure:
#if THING_N(_A)
// Do something knowing that the value THING_N(_A) evaluates to is defined and not just "nothing"
#endif
Naturalmente nessuno di questi lavori, perché #ifdef non può prendere un'espressione come argomento (e comunque finirebbe come "#ifdef 0"), e THING_N (_A) restituisce 0 all'interno di #if.
In altre parole, sto cercando un modo per rendere il preprocessore valutare:
THING_N(_A) to true
THING_N(_B) to true
THING_N(_C) to false
THING_N(_D) to false
etc...
per essere utilizzato in un condizionale.
Sembra un tipico problema [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – Lundin
Hai perfettamente ragione, sembra un problema XY (e sono contento che tu l'abbia menzionato perché non avevo mai sentito questo nome prima), ma in questo caso la suddetta è la mia X. Se qualcuno può allenarsi a Y allora forse applicherò quella Y ad una X in futuro. (cioè sto chiedendo questo per divertimento, curiosità e il desiderio di capire meglio come funziona il preprocessore C.) – Henry
Se non c'è uno scopo pratico della domanda, è sempre possibile aggiungere il tag "avvocato linguistico", che significa che sei interessato ai meccanismi del linguaggio piuttosto che cercare di risolvere un problema del mondo reale. – Lundin