Можно ли использовать оператор ConstexPR, если в качестве подходящего замены макроса отладки?C++

Программы на C++. Форум разработчиков
Anonymous
Можно ли использовать оператор ConstexPR, если в качестве подходящего замены макроса отладки?

Сообщение Anonymous »

Является ли Debug_log , полностью написанный как A, если contexpr (рекомендуется) заменить традиционную реализацию макроса журнала отладки?
Рассмотрим следующий код, составленный с -o3 и -ddebug_on , определяемый как 0 или 1.

Код: Выделить всё

#include 

constexpr bool debug_on = DEBUG_ON;

void debug_log(char *message) {
if constexpr (debug_on) {
printf("Debug: %s\n", message);
}
}

void foo() {
debug_log("FOO");
printf("Foo stuff\n");
}

void bar() {
debug_log("BAR");
printf("Bar stuff\n");
}

int main() {
bar();
foo();
bar();
}
(Godbolt: https://godbolt.org/z/gjvjo81bq)
Мы ожидаем, что функция Debug_log будет полностью пустой, когда отладка отключена, и действительно функция включена в библиотеку в виде единичной инструкции. Функции FOO и BAR больше не содержат прыжков на функцию DEBUG_LOG . Тем не менее, мы все еще видим символ журнала отладки, присутствующий в бинарном объекте (или в окончательном связанном двоичном). Что произойдет, если Debug_log был в другой единице перевода, будет ли он все еще оптимизирован полностью? Если бы это был традиционный журнал на основе макросов, мы бы полностью удалили, потому что не существует функционального вызова, а просто просто текстовая замена.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... a-debug-ma

Вернуться в «C++»