Макрос: как мне изменить каждое значение в __VA_ARGS__

Я использую 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так что я должен сделать это с макросом.

Любая помощь будет оценена.

0

Решение

Макросы 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");

2

Другие решения

Других решений пока нет …