Boost 1.55 предоставляет API журналирования с использованием оператора вставки потоков C ++ (иначе называемого оператором сдвига влево).
Хотя синтаксис удобен, я не могу придумать способ отбросить текстовые литералы отладки из исполняемого файла.
Например, при использовании MFC макрос TRACE оказывается пустой строкой в конфигурации выпуска.
Используя TRACE (или любую подобную макрос-функцию):
TRACE("This text literal shall only be found in debug configuration");
Использование Boost API:
LOG_DEBUG << "This text literal shall only be found in debug configuration";
Я протестировал (используя Visual Studio 2010, включена полная оптимизация компилятора (/ Ox)) Как удалить операторы отладки журнала из предложения потока программы, но литерал попадает в исполняемый файл в выпуске (что имеет смысл, насколько я мог предсказать результат).
2 ответа
Это работает для меня, но требует переписывания операторов журнала:
#ifdef _DEBUG
#define LOG(arg) LOG_DEBUG << arg
#else
#define LOG(arg)
#endif
Линия
LOG("This text literal shall only be found in debug configuration");
Не будет предварительно обработан до нуля для сборки без отладки. Потоковая передача тоже работает:
LOG("Answer = " << 42);
Уловка пустого operator<<
действительно работает для меня в Visual Studio 2008. Ключ, похоже, не флаг оптимизации компилятора , но флаг оптимизации компоновщика . Когда я связываюсь с /OPT:REF
a> (Удалить данные без ссылок), то строковые литералы отсутствуют в исполняемом файле.
Одна вещь, которая немного сбивает с толку, - это значение по умолчанию:
Если указан / DEBUG, значение по умолчанию для / OPT - NOREF (в противном случае - REF), и все функции сохраняются в образе.
Можно подумать, что это означает, что сборка Release будет иметь /OPT:REF
по умолчанию, и поэтому указывать флаг не нужно. В моей Visual Studio, однако, похоже, что в сборке Release по умолчанию включен /DEBUG
(что может быть полезно, но несколько нелогично), поэтому вы должны добавить /OPT:REF
во флаги сборки Release, если вы хочу такое поведение.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.