В моем проекте у меня очень много файлов, и я хочу управлять отладкой с помощью макросов C++. Для каждого файла я хочу использовать свой собственный переключатель для включения или отключения отладки и настройки уровня отладки. Таким образом, в основном есть общий файл с настройками:Многострочный макрос, определяющий другой набор макросов
Это как разделяемой файл debug.h выглядит:
#define DEBUG_LEVEL_LOG -1
#define DEBUG_LEVEL_NONE 0
#define DEBUG_LEVEL_ERROR 1
#define DEBUG_LEVEL_WARNING 2
#define DEBUG_LEVEL_INFO 3
#define DEBUG_LEVEL_DEBUG 4
#define DEBUG_LEVEL_TRACE 5
#ifndef ON
#define ON 1
#endif
#ifndef OFF
#define OFF 0
#endif
// setings for component "wireless"
#define WIRELESS_DEBUGGING ON
#define WIRELESS_DEBUGGING_LEVEL DEBUG_LEVEL_ERROR
// settings for another components
...
В каждом файле я хочу отладить с этой настройки мне нужно определить еще кучу макросов. Например, файл «wireless.h»
#ifndef WIRELESS_DEBUGGING
#define WIRELESS_DEBUGGING_LEVEL DEBUG_LEVEL_NONE
#endif
#if WIRELESS_DEBUGGING
#if WIRELESS_DEBUGGING_LEVEL >= DEBUG_LEVEL_LOG
#define WIRELESS_LOG(...); Logger::log(__VA_ARGS__);
#else
#define WIRELESS_LOG(...); {}
#endif
#if WIRELESS_DEBUGGING_LEVEL >= DEBUG_LEVEL_ERROR
#define WIRELESS_ERROR(...); Logger::error(__VA_ARGS__);
#else
#define WIRELESS_ERROR(...); {}
#endif
#if WIRELESS_DEBUGGING_LEVEL >= DEBUG_LEVEL_WARNING
#define WIRELESS_WARNING(...); Logger::warning(__VA_ARGS__);
#else
#define WIRELESS_WARNING(...); {}
#endif
#if WIRELESS_DEBUGGING_LEVEL >= DEBUG_LEVEL_INFO
#define WIRELESS_INFO(...); Logger::info(__VA_ARGS__);
#else
#define WIRELESS_INFO(...); {}
#endif
#if WIRELESS_DEBUGGING_LEVEL >= DEBUG_LEVEL_DEBUG
#define WIRELESS_DEBUG(...); Logger::debug(__VA_ARGS__);
#else
#define WIRELESS_DEBUG(...); {}
#endif
#if WIRELESS_DEBUGGING_LEVEL >= DEBUG_LEVEL_TRACE
#define WIRELESS_TRACE(...); Logger::trace(__VA_ARGS__);
#else
#define WIRELESS_TRACE(...); {}
#endif
#else
#define WIRELESS_LOG(...); {}
#define WIRELESS_ERROR(...); {}
#define WIRELESS_WARNING(...); {}
#define WIRELESS_INFO(...); {}
#define WIRELESS_DEBUG(...); {}
#define WIRELESS_TRACE(...); {}
#endif
Когда я хочу отладить данный компонент, я просто использовать что-то вроде этого (в wireless.cpp)
WIRELESS_TRACE("wireless: hello world\n");
... etc ...
До сих пор он работает. И вот вопрос: я не хочу использовать «локальную» группу определений, подобных определениям в файле «wireless.h», в каждом компоненте, который я использую только с другим префиксом. Вместо этого я хочу, чтобы иметь какой-то «супер-макро», который будет выглядеть примерно так
REGISTER_DEBUG(WIRELESS);
Есть ли способ, как добиться этого с помощью некоторых конкатенации и многострочный макрос? Я обнаружил, что использование #define
внутри #define
запрещено.
Лучше использовать сильную типизацию вещей (это то, что C++ в основном предлагает более C), и автоматизацию очистки с использованием RAII. Для отладки используйте хороший отладчик GUI, например, тот, что есть в Visual Studio.Короче говоря, хорошее профилактическое программирование и хорошие инструменты для случая, когда этого было недостаточно. –
Сколько сообщений вы хотите контролировать во время компиляции и сколько вы хотите контролировать во время выполнения. Например, хотите ли вы передать аргумент «--debug-level = trace» и ожидать, что все сообщения «трассировки» будут напечатаны? –