Решением этой проблемы было использование макросов.
Как вы можете знать или не знать, макросы в основном будут выполнять замену строк в вашем коде во время некоторой фазы предварительной обработки.
Чтобы решить эту проблему:
#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__
справа от макрос.
Это только для того, чтобы сделать его более дружелюбным к глазам.