Anche se la soluzione funziona, preferisco l'approccio seguente:
#include <stdio.h>
#define MACRO //or omitted
#ifdef MACRO
#define FUNCTION(a) Function(a);
#else
#define FUNCTION(a)
#endif
#ifdef MACRO
void Function(const char* str)
{
printf("%s\n", str);
}
#endif
int main(void)
{
FUNCTION("hello world")
getchar();
return 0;
}
Nota : la funzione è la macro, la funzione è il nome effettivo della funzione
Questo funziona definendo la funzione macro (a) per una chiamata a funzione (const char *) quando MACRO è abilitato. D'altra parte, quando MACRO è disattivata, le chiamate verso FUNZIONE (a) saranno definiti a nulla.
Io tendo a preferire questo metodo in quanto sarebbe più facile astrarre la macro utilizzato per definire la chiamata dalla macro che definisce la tua definizione di funzione. Si potrebbe avere casi in cui in modalità di rilascio solamente necessario rimuovere alcune delle chiamate di funzionare. In questo caso è ancora necessaria la definizione di funzione (). Per esempio:
#include <stdio.h>
#define DEBUG //or omitted
#ifdef DEBUG
#define FUNCTION(a) Function(a);
#else
#define FUNCTION(a)
#endif
void Function(const char* str)
{
printf("%s\n", str);
}
int main(void)
{
// Call function with Hello World only in debug
FUNCTION("hello world")
getchar();
// Call function with goodbye world in both debug and release
Function("goodbye world");
return 0;
}