Чтобы иметь возможность отключить или подключить весь отладочный вывод в коде в одном месте, я использую следующую конструкцию:
В коде тогда отладочный вывод выглядит так:
Помимо заданной строки выводится уровень логгирования, имя файла, номер строчки и имя функции.
Следует отметить, что идентификатор __PRETTY_FUNCTION__ (для получения имени текущей функции) не является частью стандарта, это расширение GCC. В стандарте С99 и в С++11 присутствует идентификатор __func__, предназначенный для этих же целей. Так же некоторые компиляторы подерживают расширение __FUNCTION__, но при этом не поддерживают __func__, описанный в стандартах (например, некоторые версии Visual Studio). GCC обычно поддерживает все три идентификатора, но я использую __PRETTY_FUNCTION__, потому что помимо имени функции он предоставляет полную сигнатуру (имя класса, если это метод, список параметров и возвращаемое значение).
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
typedef enum {
DL_INFO = 0,
DL_ERROR
} DebugLevel;
char * dlToString(DebugLevel dl) {
static char INFO [] = "INFO";
static char ERROR [] = "ERROR";
switch(dl) {
default:
case DL_INFO:
return INFO;
case DL_ERROR:
return ERROR;
}
}
void printDebugString(const char * file, int line, const char * method, DebugLevel dl, const char* format, ...) {
va_list arglist;
va_start(arglist, format);
printf("%s: %s:%d:%s:", dlToString(dl), file, line, method);
vprintf(format, arglist);
va_end(arglist);
}
#define DEBUG_PRINT(LEVEL, FMT, ...) printDebugString(__FILE__, __LINE__, __PRETTY_FUNCTION__, LEVEL, FMT, ##__VA_ARGS__)
DEBUG_PRINT(DL_ERROR, "Some error message %s %d\n", cStringParameter, intParameter);
Помимо заданной строки выводится уровень логгирования, имя файла, номер строчки и имя функции.
Следует отметить, что идентификатор __PRETTY_FUNCTION__ (для получения имени текущей функции) не является частью стандарта, это расширение GCC. В стандарте С99 и в С++11 присутствует идентификатор __func__, предназначенный для этих же целей. Так же некоторые компиляторы подерживают расширение __FUNCTION__, но при этом не поддерживают __func__, описанный в стандартах (например, некоторые версии Visual Studio). GCC обычно поддерживает все три идентификатора, но я использую __PRETTY_FUNCTION__, потому что помимо имени функции он предоставляет полную сигнатуру (имя класса, если это метод, список параметров и возвращаемое значение).
Комментариев нет :
Отправить комментарий