Получение препроцессора для обработки блока кода - PullRequest
4 голосов
/ 30 декабря 2011

У меня есть система, в которой в командной строке я указываю уровень детализации. В своих функциях я проверяю, что было указано, чтобы определить, ввожу ли я блок кода:

#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), но я бы предпочел, чтобы был какой-то способ заставить препроцессор фактически выбросить весь блок. Можно ли это сделать?

Ответы [ 3 ]

2 голосов
/ 30 декабря 2011

Я не могу придумать, как это сделать, не оборачивая весь блок в макрос.

Но это может работать для ваших целей:

#if DEBUG
#define IF_VERBOSE_BIT_D(x) {x}
#else
#define IF_VERBOSE_BIT_D(x)
#endif

IF_VERBOSE_BIT_D(
    cout << "this is" << endl;
    cout << "in verbose" << endl;
    printf("Code = %d\n", 1);
)

Действительно, компилятор должен иметь возможность оптимизировать if (0), но я часто делаю что-то подобное, когда код внутри блока вообще не компилируется, когда не в режиме отладки.

1 голос
/ 30 декабря 2011

Не так аккуратно, как вы это сделали. Не волнуйтесь, ваш компилятор полностью оптимизирует любой блок if(0).

Вы можете, если хотите, проверить это, написав программу, в которой она у вас есть, как описано, и скомпилировав ее. Если вы затем удалите блоки if(false), он должен скомпилироваться в точно такой же двоичный файл, как показано в хеше MD5. Но это не обязательно, я обещаю, что ваш компилятор может это понять!

0 голосов
/ 30 декабря 2011

Просто создайте условие в операторе if, который начинается с "false &&", если вы хотите полностью его отключить. Если вы не компилируете без какой-либо оптимизации, компилятор обычно удаляет мертвый код.

...