宏:如何更改__VA_ARGS__中的每个值

时间:2012-12-14 04:19:52

标签: c++ c macros c++builder-xe2

我正在使用C ++ Builder XE3。

目前我有如下宏:

#define LOGG(message, ...) OTHER_LIB_LOG(message,__VA_ARGS__)

现在我想让所有参数都成为AnsiString。 我很容易处理这个论点:如下所示的消息:

#define LOGG(message, ...) OTHER_LIB_LOG(AnsiString(message),__VA_ARGS__)

但是对于 VA_ARGS ,我不知道如何处理参数以确保放到OTHER_LIB_LOG的所有参数都是AnsiString。

我很难修改OTHER_LIB_LOG的源代码,因此我必须使用Macro执行此操作。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

C宏不会递归。所以你必须做一些手动工作 找到LOGG将采用的最大参数数量&使用如下:我的例子需要最多6个参数。

#define ENCODE0(x) AnsiString(x)
#define ENCODE1(x,...) AnsiString(x), ENCODE0(__VA_ARGS__)
#define ENCODE2(x,...) AnsiString(x), ENCODE1(__VA_ARGS__)
#define ENCODE3(x,...) AnsiString(x), ENCODE2(__VA_ARGS__)
#define ENCODE4(x,...) AnsiString(x), ENCODE3(__VA_ARGS__)
#define ENCODE5(x,...) AnsiString(x), ENCODE4(__VA_ARGS__)
#define ENCODE6(x,...) AnsiString(x), ENCODE5(__VA_ARGS__)
//Add more pairs if required. 6 is the upper limit in this case.
#define ENCODE(i,...) ENCODE##i(__VA_ARGS__) //i is the number of arguments (max 6 in this case)

#define LOGG(count,...) OTHER_LIB_LOG(ENCODE(count,__VA_ARGS__))

示例用法:LOGG(5,"Hello","Hi","Namaste _/\_","Hola!","bonjour");