Mesmo que a sua solução funciona, eu prefiro a seguinte abordagem:
#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 : função é a macro, a função é o nome real da função
Isso funciona, definindo a função macro (a) para uma chamada para a função (const char *) quando MACRO está habilitado. Por outro lado, quando MACRO está desativado, as chamadas para FUNÇÃO (a) será definida a nada.
I tendem a preferir este método, uma vez que seria mais fácil abstrair da macro usada para definir a sua chamada da macro definir sua definição de função. Você pode ter casos em que no modo de versão você só precisa remover algumas das chamadas de função. Nesse caso, ainda é necessária a definição de função (). Por exemplo:
#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;
}