0

我正在使用 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,所以我必须使用宏来完成。

任何帮助将不胜感激。

4

1 回答 1

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");

于 2012-12-14T05:35:56.397 回答