#c #препроцессор
Нужно исключить отладочные printf() из программы, применяя константу препроцессора.
Обрамлять каждый вызов printf()
#if DEBUG == 1
printf();
#endif
не хочется. Можно ли сделать что-то типа:
#define printf(x,y) (if DEBUG == 1 printf(x,y) endif)
#if внутри макроопределений запрещены. Есть ли альтернатива?
Ответы
Ответ 1
Можно определять макрос по разному в зависимости от значения DEBUG: #if DEBUG==1 #define printf_d(...) printf(__VA_ARGS__); #else #define printf_d(...) #endif Но лучше сделать это немного по другому, проверяя не значение, а факт наличия макроопределения: #ifdef DEBUG // . . . Такой подход позволяет включить режим отладки простым указанием имени проверяемого макроса в Make-файле или даже в параметрах команды сборки.Ответ 2
Объявите разные версии макроса PRINT - для отладки и обычную #ifdef _DEBUG #define PRINT(x,y) print(x,y) #else #define PRINT(x,y) #endifОтвет 3
Вот прям не знаю даже, какому из 2-х вариантов (@kff или @gbg) отдать предпочтение: в обоих что-то да не нравится, вот такой нравится: #ifdef _DEBUG #define PRINT(...) print(__VA_ARGS__) #else #define PRINT(...) #endif его и использую, а вот вместо _DEBUG тут лучше использовать любой другой флаг, чтобы отладочную печать можно было включить, независимо от глобальной оптимизации. На самом деле, я часто использую немного другую схему: у меня есть разные версии PRINT, с разными префиксами, чтобы можно было логику вывода на печать детализировать на разных уровнях: #ifdef ENABLE_PRINT #define PRINT(...) print(__VA_ARGS__) #else #define PRINT(...) #endif #ifdef ENABLE_VERB_PRINT #define VERB_PRINT(...) print(__VA_ARGS__) #else #define VERB_PRINT(...) #endif ... А в коде - уже расставляем версии PRINT'ов, в зависимости от логики работы функций: void myFunc(){ VERB_PRINT("func: %s", __FUNCTION__); ... if( !... ){ PRINT("error:%...", ...); } ... } Теперь, можно не меняя код, управлять детализацией логирования, добавляя соответствующие флаги для препроцессора.
Комментариев нет:
Отправить комментарий