У меня есть система, в которой в командной строке я указываю уровень детализации. В своих функциях я проверяю, что было указано, чтобы определить, ввожу ли я блок кода:
#ifdef DEBUG
if (verbose_get_bit(verbose_level_1)) {
// arbitrary debugging/printing style code generally goes in here, e.g.:
printf("I am printing this because it was specified and I am compiling debug build\n");
}
#endif
Я бы хотел сделать это менее утомительным, так что вот что у меня есть:
// from "Verbose.h"
bool verbose_get_bit(verbose_group_name name); // verbose_group_name is an enum
#ifdef DEBUG
#define IF_VERBOSE_BIT_D(x) if (verbose_get_bit(x))
#else // not debug: desired behavior is the entire block that follows gets optimized out
#define IF_VERBOSE_BIT_D(x) if (0)
#endif // not debug
Теперь я могу сделать это:
IF_VERBOSE_BIT_D(verbose_GL_debug) {
printf("I don't want the release build to execute any of this code");
glBegin(GL_LINES);
// ... and so on
}
Мне это нравится, потому что он выглядит как оператор if, он функционирует как оператор if, ясно, что это макрос, и он не запускается в сборке выпуска.
Я бы был вполне уверен, что код будет оптимизирован, так как он будет заключен в блок if(false)
, но я бы предпочел, чтобы был какой-то способ заставить препроцессор фактически выбросить весь блок. Можно ли это сделать?