Чтобы иметь возможность отключить или подключить весь отладочный вывод в коде в одном месте, я использую следующую конструкцию:
В коде тогда отладочный вывод выглядит так:
Помимо заданной строки выводится уровень логгирования, имя файла, номер строчки и имя функции.
Следует отметить, что идентификатор __PRETTY_FUNCTION__ (для получения имени текущей функции) не является частью стандарта, это расширение GCC. В стандарте С99 и в С++11 присутствует идентификатор __func__, предназначенный для этих же целей. Так же некоторые компиляторы подерживают расширение __FUNCTION__, но при этом не поддерживают __func__, описанный в стандартах (например, некоторые версии Visual Studio). GCC обычно поддерживает все три идентификатора, но я использую __PRETTY_FUNCTION__, потому что помимо имени функции он предоставляет полную сигнатуру (имя класса, если это метод, список параметров и возвращаемое значение).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #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__) |
1 | 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__, потому что помимо имени функции он предоставляет полную сигнатуру (имя класса, если это метод, список параметров и возвращаемое значение).
Комментариев нет :
Отправить комментарий