Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Си. Условные операторы в макроопределении препроцессора. Возможно ли?

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

Комментариев нет:

Отправить комментарий