Рассмотрим следующий код, составленный с -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();
}
Мы ожидаем, что функция Debug_log будет полностью пустой, когда отладка отключена, и действительно функция включена в библиотеку в виде единичной инструкции. Функции FOO и BAR больше не содержат прыжков на функцию DEBUG_LOG . Тем не менее, мы все еще видим символ журнала отладки, присутствующий в бинарном объекте (или в окончательном связанном двоичном). Что произойдет, если Debug_log был в другой единице перевода, будет ли он все еще оптимизирован полностью? Если бы это был традиционный журнал на основе макросов, мы бы полностью удалили, потому что не существует функционального вызова, а просто просто текстовая замена.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... a-debug-ma
Мобильная версия