多行宏定义另一组宏
Multi-line macro defining another set of macros
在我的项目中,我有很多文件,我想用C 宏管理调试。对于每个文件,我想使用自己的开关来启用或禁用调试并调整调试级别。因此,基本上有带有设置的共享文件:
这是共享文件调试的方式:
#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 worldn");
... etc ...
到目前为止,它正在工作。这是一个问题:我不想使用与文件"无线"定义类似的"本地"定义,我在我仅使用不同前缀的每个组件中使用。我不想拥有一些"超级宏",看起来与此相似
REGISTER_DEBUG(WIRELESS);
有没有办法使用一些串联和多行宏来实现这一目标?我发现禁止使用#define
内部使用#define
。
我不完全确定您想要什么,因此,如果这不合适,请告诉我,我将删除。
有可能使用##
在预处理器中串联令牌。参见,例如,https://gcc.gnu.org/onlinedocs/cpp/concatenation.html
这有点笨拙,但应该做到这一点:
#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
#define TRACE(a,...) _TRACE(a,__VA_ARGS__)
#define _TRACE(a,...) __TRACE_##a(__VA_ARGS__)
#define __TRACE_5(...) do{Logger::trace(__VA_ARGS__);}while(0)
这是笨拙的:您还需要定义 __TRACE_4
, __TRACE_3
等才能为空。然后,您需要定义相同的内容以进行调试:
#define __DEBUG_4(...) do{Logger::debug(__VA_ARGS__);}while(0)
但最后,在定义了无线日志级别之后:
#define WIRELESS_LEVEL 5
您可以像这样调用宏:
TRACE(WIRELESS_LEVEL,"wireless: hello worldn");
编辑另外(这可能更干净):
#define __PRINT_55(...) do{Logger::trace(__VA_ARGS__);}while(0)
#define __PRINT_44(...) do{Logger::debug(__VA_ARGS__);}while(0)
// etc...
// Also need to define what you need to be not printed:
#define __PRINT_01(...)
// etc...
#define PRINT(a,b,...) _PRINT(a,b,__VA_ARGS__)
#define _PRINT(a,b,...) __PRINT_##a##b(__VA_ARGS__)
现在您可以这样调用您的功能:
PRINT(DEBUG_LEVEL_TRACE, WIRELESS_LEVEL, "Hello worldn");
您可以通过从宏切换到内联函数来到达那里。这样的东西:
// debug.h
enum DebugLevel {
DEBUG_LEVEL_LOG = -1,
DEBUG_LEVEL_NONE = 0,
DEBUG_LEVEL_ERROR = 1,
DEBUG_LEVEL_WARNING = 2,
DEBUG_LEVEL_INFO = 3,
DEBUG_LEVEL_DEBUG = 4,
DEBUG_LEVEL_TRACE = 5
};
// settings for component "wireless"
constexpr bool WIRELESS_DEBUGGING = true;
constexpr DebugLevel WIRELESS_DEBUGGING_LEVEL = DEBUG_LEVEL_ERROR;
#define REGISTER_DEBUG_FUNC(topic, level, func)
template <typename... Args>
inline void topic##_##level(Args&& ... args) {
if ( topic##_DEBUGGING && topic##_DEBUGGING_LEVEL >= DEBUG_LEVEL_##level )
Logger::func(std::forward<Args>(args)...);
}
#define REGISTER_DEBUG(topic)
REGISTER_DEBUG_FUNC(topic, LOG, log)
REGISTER_DEBUG_FUNC(topic, ERROR, error)
REGISTER_DEBUG_FUNC(topic, WARNING, warning)
REGISTER_DEBUG_FUNC(topic, INFO, info)
REGISTER_DEBUG_FUNC(topic, DEBUG, debug)
REGISTER_DEBUG_FUNC(topic, TRACE, trace)
// wireless.h
REGISTER_DEBUG(WIRELESS)
相关文章:
- 在 c++ 中定义一组 set 的迭代器
- 这是定义一组递归规则的正确方法吗?
- c++在循环中定义一组概率分布
- 为什么此模板定义了一组匹配void的别名类型
- 组合宏定义以一次获得多个定义 [avr C++]
- 生成一组随机的 x,y,z 数,它们之间和定义的限制之间具有最小差异
- 是否有另一种方法可以在不使用宏定义的情况下进行此操作
- 多行宏定义另一组宏
- 是在不同地方捕获一组例外的宏
- 如何从一组已定义的描述符动态构建新的 protobuf
- 如何用自定义比较表示一组指针,但保持原始原始指针的重复比较
- 在C++中标记或定义一组语句
- C++,声明一个数组与定义;发生了什么事情?(简单快捷)
- 使用可变宏或模板来实现一组函数
- 我应该如何在typedef中定义一组位数
- std::一组没有特定定义的模板类
- 如何创建一组未定义的shared_ptr对象
- C++ 我知道数组长度,但想知道是否是一种更简洁的数组元素定义方法
- 存储一组指针会导致未定义的行为吗
- 使用预处理器定义在一组类型之间进行选择