Я использую 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
так что я должен сделать это с макросом.
Любая помощь будет оценена.
Макросы 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");
Других решений пока нет …