Добавление дополнительных аргументов в va_list функции с переменным аргументом в c c ++ - PullRequest
0 голосов
/ 04 января 2019

У меня есть определенная библиотекой функция, которую я не могу ни изменить, ни изменить способ ее вызова. Функция выглядит примерно так:

void originalFunction(const char *file, int line, error_type msg, const char* tag, ...);

Эта функция будет вызывать определенную библиотеку следующим образом:

void originalFunction(const char *file, int line, error_type msg, const char* tag, ...){
  va_list ap;
  va_start(ap, tag);
  ...
  vExtIssueMessage(msg, ap);
  ...
  va_end(ap);
}

Что мне нужно было сделать, это добавить несколько дополнительных аргументов в конец списка переменных аргументов. В данном конкретном случае я хочу добавить файл и строку в список аргументов, потому что я не могу просто вызвать:

vExtIssueMessage(msg, ap, file, line);

Как бы это сломало подпись функции.

1 Ответ

0 голосов
/ 04 января 2019

Решением этой проблемы было использование макросов. Как вы можете знать или не знать, макросы в основном будут выполнять замену строк в вашем коде во время некоторой фазы предварительной обработки.

Чтобы решить эту проблему:

#define originalFunction(arg1, arg2, args...) intermediateFunction(arg1, arg2, args)
#define intermediateFunction(file, line, args...) originalFunction2(file, line, args, file, line)
void originalFunction2(const char *file, int line, error_type, const char*, ...);

Вы можете заметить, что я использовал там 2 разных макроса. Это связано с тем, что некоторые вызовы функций использовали другой макрос, который не раскрылся бы, поэтому компилятор мог бы ошибиться, сообщив мне, что у меня есть функция аргументов X, и я даю ей аргументы X-2. При использовании промежуточного макроса вы заставляете препроцессор расширять внутренний макрос, что дает вам желаемый результат.

Вы также можете заметить, что я использовал args... и затем назвал их как args вместо обычного способа в C ++, function(arg1, arg2, ...), а затем эти '...' аргументы с именем __VA_ARGS__ справа от макрос. Это только для того, чтобы сделать его более дружелюбным к глазам.

...