Есть ли лучший путь, чем #if DebugMode для входа

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

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

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

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

Спасибо!

6
задан Daniel 15 April 2010 в 04:57
поделиться

4 ответа

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

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

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

Есть другие способы и библиотеки (например, boost), но это быстро даст вам кое-что.

5
ответ дан 10 December 2019 в 02:44
поделиться

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

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 __ ] для текущего номера строки и имени исходного файла для записи в журнал. С помощью приведенного выше кода вы (вероятно) захотите передать их перед строкой формата.

2
ответ дан 10 December 2019 в 02:44
поделиться

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

bar_t  bar;

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

Дополнительную информацию можно найти на их странице производительности .

2
ответ дан 10 December 2019 в 02:44
поделиться

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

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

0
ответ дан 10 December 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: