Я использовал два макроса для этого. Первый определяет условие для печати. В этом простом примере мы печатаем каждый раз, когда параметр не равен нулю. Можно использовать более сложные выражения.
Второй определяет, на основании первого макроса, вызывать или нет printf.
Если условие может быть определено компилятором (с правильными настройками оптимизации), код не генерируется.
Если условие не может быть определено во время компиляции, то будет во время выполнения. Одним из преимуществ этого метода является то, что если printf не произойдет, то весь printf не будет оцениваться, что исключает множество преобразований в строку, которые могут произойти в сложном операторе printf.
#define need_to_print(flag) ((flag) != 0))
#define my_printf(debug_level, ...) \
({ \
if(need_to_print(debug_level)) \
printf(__VA_ARGS__); \
})
чтобы использовать его, вызовите my_printf вместо printf и добавьте параметр в начале для условия печати.
my_printf(0, "value = %d\n", vv); //this will not print
my_printf(1, "value = %d\n", vv); //this will print
my_printf(print_debug, "value = %d\n", vv); //this will print if print_debug != 0
круглые скобки (...), окружающие макрос, делают его единственным выражением.