1. Если вы используете g ++, вы можете использовать флаг -D, это позволит компилятору определить макрос по вашему выбору.
Определение
Например:
#ifdef DEBUG_FLAG
printf("My error message");
#endif
2. Я согласен, что это тоже не элегантно, поэтому, чтобы сделать его немного лучше:
void verbose(const char * fmt, ... )
{
va_list args; /* Used as a pointer to the next variable argument. */
va_start( args, fmt ); /* Initialize the pointer to arguments. */
#ifdef DEBUG_FLAG
printf(fmt, &args);
#endif
/*This isn't tested, the point is to be able to pass args to
printf*/
}
То, что вы можете использовать как printf:
verbose("Error number %d\n",errorno);
3. Третье решение проще, и больше похоже на C ++ и Unix - передать аргумент вашей программе, который будет использоваться - как макрос ранее - для инициализации конкретной переменной (которая может быть глобальным постоянным).
Пример:
$ ./myprogram -v
if(optarg('v')) static const verbose = 1;