2014-07-18 27 views
6

La domanda mi è venuta in mente osservando il meccanismo di rilevamento delle perdite di memoria in VS. Ci vuole il seguente codice boilerplate:Posso definire una macro che definisce macro?

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

ma sostituendo questo codice con DETECT_MLEAKS:

#define DETECT_MLEAKS\ 
#define _CRTDBG_MAP_ALLOC\ 
#include <stdlib.h>\ 
#include <crtdbg.h>\ 

non può essere fatto.

Esistono soluzioni alternative: suggerimenti?

+8

Puoi mettere quelle linee (e una guardia di inclusione) in detect_memleaks.h e "#include" detect_memleaks.h "" invece. .. – slazyk

risposta

4

Nel linguaggio C standard, le macro non possono generare direttive di preelaborazione. Per esempio nella norma ISO 9899: 1999:

6.10.3.4 Riscansione e in seguito in sostituzione

[...]

I risultanti completamente macro-sostituito preelaborazione sequenza di token non viene elaborata come una direttiva al preprocessore anche se assomiglia a uno, [...]

(Questo "anche se assomiglia a una" osservazione è del tutto superfluo perché, ovviamente, non sintassi viene mai trattata come ap direttiva di ritrattamento se lo fa non simile a uno! Eppure, le parole rimangono impresse nella tua mente per anni. Ho appena localizzato la sezione della citazione cercando nel documento la stringa "simile a una".)

6
//#define DETECT_MLEAKS //Uncomment to detect mem-leaks 
#ifdef DETECT_MLEAKS 
#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 
#endif 

È come faccio di solito queste cose.