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)) Как удалить операторы отладки журнала из предложения потока программы, но литерал попадает в исполняемый файл в выпуске (что имеет смысл, насколько я мог предсказать результат).

4
Maestro 29 Май 2014 в 01:32

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);
0
alain 29 Май 2014 в 02:17

Уловка пустого operator<< действительно работает для меня в Visual Studio 2008. Ключ, похоже, не флаг оптимизации компилятора , но флаг оптимизации компоновщика . Когда я связываюсь с /OPT:REF (Удалить данные без ссылок), то строковые литералы отсутствуют в исполняемом файле.

Одна вещь, которая немного сбивает с толку, - это значение по умолчанию:

Если указан / DEBUG, значение по умолчанию для / OPT - NOREF (в противном случае - REF), и все функции сохраняются в образе.

Можно подумать, что это означает, что сборка Release будет иметь /OPT:REF по умолчанию, и поэтому указывать флаг не нужно. В моей Visual Studio, однако, похоже, что в сборке Release по умолчанию включен /DEBUG (что может быть полезно, но несколько нелогично), поэтому вы должны добавить /OPT:REF во флаги сборки Release, если вы хочу такое поведение.

0
Community 23 Май 2017 в 14:50
Я попытался использовать опцию REF и использовать VS2008 с теми же результатами. Я понял, что компоновщик не имеет к этому никакого отношения, на самом деле: я создал консольный проект в VS2008, определив класс DevNull перед основным (то есть в том же модуле). В отладке литерал был там, но НЕ в релизе... с использованием REF... или NOREF явно! Я заметил, что оптимизация компилятора была установлена ​​на «Максимальная скорость (/O2)» вместо «Полная оптимизация (/Ox)», что ЕСТЬ и имеет значение. В итоге получается, что другое решение намного проще и легко переносимо, но в этом посте также освещались интересные факты.
 – 
Maestro
29 Май 2014 в 21:54