通过定义创建和调整变量名称和值
Creating and adjusting variable names and values through defines
我正试图在C++中为日志记录类创建一个友好的接口。这个练习的最终目标是能够创建一个可以根据使用的级别进行更改的单一定义:
MODULE_LOG(name, LOG_ALARM);
有几个级别,但我只想更改上面的定义。例如,为了记录消息,它将更改为:
MODULE_LOG(name, LOG_MESSAGE, LOG_ALARM);
其想法是,代码将具有一个打印定义,该定义将根据MODULE_LOG定义中的要求进行定义/取消定义。因此,如果没有定义LOG_MESSAGE,那么消息打印宏将被定义为空,否则如果它在列表中,它将打印。
看到我在define/unde路由方面没有任何进展,我想到了使用变量。我的想法是根据传入的级别创建一组变量。例如
#define LOG_LEVEL(lvl,val)
static int LOG_LEVEL_##lvl = val
然而,我遇到了另一个问题,在C++中使用可变宏。我似乎无法让宏创建多个名称(即用户传入LOG_MESSAGE和LOG_ALARM,只创建其中一个)。此外,我还无法动态设置单个值。
所以我的问题是:
有没有一种方法可以定义/取消定义打印宏的使用defines?
可以使用variadic宏来遍历传递给它的列表并根据需要创建变量吗?
谢谢。
EDIT-无法使用boost。
使用数组捕获varargs怎么样?
enum LogLevel { LOG_ALARM, LOG_MESSAGE /*, ...*/, LOG_UNDEFINED};
#ifdef LOGGING_ENABLED
#define MODULE_LOG(name, ...)
LogLevel levels[] = { __VA_ARGS__ , LOG_UNDEFINED }
for(int i = 0; levels[i] != LOG_UNDEFINED; i++)
printLog(levels[i], name) // or something
#else
#define MODULE_LOG(name, ...)
#endif
- 没有。不能在宏中
#define
- 不直接。只要付出一些努力,你就可以得到难看的、几乎不能工作的宏。我真的不建议走这条路,但下面是:
你需要做的第一件事是知道一个宏有多少参数。没有直接的方法,但看看这个(取自这里):
#define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL(__VA_ARGS__, 5,4,3,2,1)
#define VA_NUM_ARGS_IMPL(_1,_2,_3,_4,_5,N,...) N
现在你可以做一些类似的事情:
#define CONCAT(a,b) a##b
#define A(...) CONCAT(A,A_NUM_ARGS(__VA_ARGS__))(__VA_ARGS__)
#define A_1(x) something(x)
#define A_2(x, y) something_else(x, y)
...
您必须根据要支持的最大参数数量重新打开上述定义。
相关文章:
- 你能重载对象变量名本身返回的内容吗
- 在C/C++中将变量名定义为__00000001有什么好处吗
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- C++ - 声明中变量名后面的括号
- 如何使替换 c 函数的变量名成为错误?
- 是否可以创建没有变量名的变量
- fstream库,试图创建一个变量名为(c++)的文件
- 一个数组C++中的消息和变量名
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 数组的变量名和该数组的地址有什么区别?
- 如何将变量名设置为字符串?C++
- 类中具有相同变量名的多重继承
- 如何在从.txt文件中读取时不重复相同的变量名
- 在循环中使用相同的变量名可以吗
- C++保留符号作为C变量名
- 在C++中,在给定的相同作用域内声明相同的变量名
- 为什么类名与"::"一起使用在变量名之前?
- 在同级之间继承相同的变量名
- __COUNTER__变量名中
- 按变量名遍历结构