Sono un po 'riluttante a postare questa risposta perché l'uso di macerie macro può diventare la fonte di problemi. Tuttavia - se le chiamate alla funzione che si desidera siano scomparse vengono sempre utilizzate da sole in un'istruzione (cioè, non fanno mai parte di un'espressione più grande), quindi qualcosa di simile potrebbe funzionare (e gestisce vararg):
#ifdef SOMETHING
#define foo (1) ? ((void) 0) : (void)
#else
#define foo MyFunction
#endif
Quindi, se avete la riga di codice:
foo("this is a %s - a++ is %d\n", "test", a++);
si finirà dopo la fase di pre-elaborazione o come:
MyFunction("this is a %s - a++ is %d\n", "test", a++);
o
(1) ? ((void) 0) : (void)("this is a %s - a++ is %d\n", "test", a++);
che trasforma elenco di parametri di pseudo-funzione in un mazzo di espressioni separate dall'operatore virgola che non sarà mai valutata, poiché il condizionale restituisce sempre il risultato ((void) 0)
.
Una variante di questo è qualcosa di simile a ciò che ChrisW e Jonathan Leffler ha suggerito:
#ifdef SOMETHING
#define foo if (0) MyFunction
#else
#define foo if (1) MyFunction
#endif
Questo è leggermente differente in quanto non richiede il compilatore per supportare le macro variadic (__VA_ARGS__
).
Penso che questo possa essere utile per eliminare le chiamate di funzioni di traccia di debug che generalmente non vengono mai combinate in un'espressione più grande, ma al di là di ciò penso che sia una tecnica pericolosa.
Nota il potenziale di problemi, specialmente se i parametri nella chiamata producono effetti collaterali (questo è un problema generale con i macro - non solo questo hack). Nell'esempio, lo a++
verrà valutato solo se SOMETHING
è definito nel build, altrimenti non lo è. Quindi se il codice dopo la chiamata dipende dal valore di a
da incrementare, una delle build ha un bug.
Verificare se il compilatore supporta i "macro variadic". – ChrisW
_Perché ... vorresti farlo? Forse c'è un altro modo per ottenere ciò di cui hai bisogno. Perché senza contesto, ciò che si vuole fare sembra piuttosto pericoloso ... – gimpf
Per i compilatori che non supportano macro variadic è bello essere in grado di eliminare le stringhe di debug e le chiamate di funzione. Salva un sacco di spazio eseguibile. – MSN