通过定义创建和调整变量名称和值

Creating and adjusting variable names and values through defines

本文关键字:变量名 调整 定义 创建      更新时间:2023-10-16

我正试图在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,只创建其中一个)。此外,我还无法动态设置单个值。

所以我的问题是:

  1. 有没有一种方法可以定义/取消定义打印宏的使用defines?

  2. 可以使用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
  1. 没有。不能在宏中#define
  2. 不直接。只要付出一些努力,你就可以得到难看的、几乎不能工作的宏。我真的不建议走这条路,但下面是:

你需要做的第一件事是知道一个宏有多少参数。没有直接的方法,但看看这个(取自这里):

#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)
...

您必须根据要支持的最大参数数量重新打开上述定义。