#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:%...", ...); } ... } Теперь, можно не меняя код, управлять детализацией логирования, добавляя соответствующие флаги для препроцессора.
Комментариев нет:
Отправить комментарий