Есть ли лучший способ, чем #if DebugMode для ведения журнала - PullRequest
6 голосов
/ 15 апреля 2010

Я делаю библиотеку c ++, которая будет P / Вызвана из c #, поэтому я не могу перебирать / отлаживать сторону c ++. Поэтому я решил добавить протоколирование, чтобы я мог видеть, идет ли что-то не так и где это происходит. Я добавляю #define DebugMode 1, чтобы определить, должен ли я войти или нет. Прежде всего, я не очень хорош в C ++, но знаю достаточно, чтобы обойтись. Итак, мои вопросы:

  1. Есть ли лучший способ, чем оборачивать #if DebugMode #endif s при каждом вызове журнала? Я мог бы просто сделать это внутри метода Log и просто вернуться, если ведение журнала не включено, но разве это не значит, что все эти строки будут находиться в сборке?

  2. Как я могу эмулировать, что printf делает с оператором "...", позволяющим мне передать что-то вроде Log("Variable x is {0}", x);

  3. Существуют ли какие-либо приемы, такие как получение номера строки или информации трассировки стека, которую я могу использовать в журнале?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 15 апреля 2010

Один простой способ - просто определить макрос, который ничего не делает, если вы не в режиме отладки. Таким образом, вам не нужно заключать каждый вызов в #ifdef.

Простая реализация может быть:

#if DebugMode
#define MY_LOG(string, ...) printf(string, __VA_ARGS__)
#else
#define MY_LOG(string, ...)
#endif

Существуют и другие способы и библиотеки (например, boost), но это поможет вам быстро.

2 голосов
/ 15 апреля 2010

Я рекомендую использовать Pantheios , и тогда вам больше не нужно заботиться о DEBUG /! DEBUG. Библиотека использует шаблоны C ++, чтобы убедиться, что производительность не оплачивается, когда ведение журнала не включено. Он также на 100% безопасен для типов и расширяем для пользовательских типов.

bar_t  bar;

pantheios::log_DEBUG("foo ", bar, " was doing something you should remember");

Посетите их страницу производительности для получения дополнительной информации.

2 голосов
/ 15 апреля 2010

Если условие является константой времени компиляции, значит, ваш код (после предварительной обработки) работает примерно так:

if (0) 
    do the logging

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

Код, который действует как printf, довольно прост:

#include <stdarg.h>

void log(char const &fmt, ...) { 
    if (do_logging) {
        va_list args;

        va_start(args, fmt);
        vfprintf(output_file, fmt, args);
    }
}

В макросе (важно, чтобы он был в макросе, а не в вызываемой функции), вы можете использовать __FILE__ и __LINE__ для текущего номера строки и имени исходного файла, чтобы поместить в журнал. Используя приведенный выше код, вы (вероятно) захотите передать их перед строкой форматирования.

0 голосов
/ 15 апреля 2010

Как насчет отладки библиотеки C ++? В свойствах проекта библиотеки C ++ «Отладка» выберите клиент C # в поле «Команда» и начните отладку.

О ведении журнала, вы спрашиваете о ведении журнала C ++ или C #? У бота есть константы препроцессора, определенные только в конфигурации отладки, вы можете использовать их.

...