ищу макрос который заменит функцию

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

float func_x(float a){
float b
return b
}

эта функция происходит примерно в 1000 местах. Теперь новая функция была добавлена:

void func_x2(void *a, void *b){
do sth
}

Эта функция должна заменить все вхождения func_x в коде, поэтому изменение должно произойти из (псевдокод):

float p = 123.33;
float x = func_x(p)
to:
float x;
float p = 123.33;
func_x2((void *)&p, (void*)&x);

Мой вопрос:
Это даже возможно написать какой-нибудь макрос C (даже очень сложный), который заменит func_x на func_x2, чтобы код вообще не изменился? Кто-нибудь пытался это сделать?

С уважением
J

1

Решение

Вы не просто заменяете реализацию функции, но и ее подпись. Любой макрос, объявляющий дополнительную переменную, обязательно приведет к ошибкам, потому что вы не можете объявлять переменные на каждом сайте, где вы можете вызывать функции.

Лучший способ — использовать функцию поиска и замены вашего редактора, исправляя это в каждом конкретном случае.

4

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

Я понятия не имею, что на самом деле делают функции, но в случае, если x2 является просто расширением x, вы можете сделать что-то подобное

float func_x(float a){
float b;
func_x2((void *)&a, (void *)&b);
return b;
}
4

Точно то, что вы хотите, не возможно. Вы можете переименовать / удалить оригинальный func_x и заменить его функцией, которая просто вызывает func_x2.

0

Это невозможно, так как вы пытаетесь изменить определение и реализацию функции.

0

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

Это регулярное выражение ловит пример, приведенный в вопросе

^.*?\s(.*)\s*=\s*func_x\(\s*(.*)\)

и тогда вы можете использовать что-то вроде этого, чтобы заменить его

float \2;\nfunc_x2\(\(void \*\)&\2, \(void\*\)&\1\)

Конечно, вам, вероятно, придется немного подправить это регулярное выражение, и есть разные разновидности регулярных выражений, но это дает вам представление о том, что вы могли бы сделать.

0
По вопросам рекламы [email protected]