1

我不知道主题名称是否准确地介绍了我的问题,但事情是:在我的公司代码中,有一个功能,例如:

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);

我的问题是:是否有可能编写一些将 func_x 替换为 func_x2 的 C 宏(甚至非常复杂),所以代码根本不会改变?有人试过吗?

问候J

4

5 回答 5

4

您不仅要替换函数的实现,还要替换它的签名。任何声明额外变量的宏肯定会导致错误,因为您不能在可以调用函数的每个站点上声明变量。

最好的方法是使用编辑器的查找和替换功能,逐案修复。

于 2013-05-03T09:08:34.233 回答
4

我不知道函数的真正作用,但如果 x2 只是 x 的扩展,你可以做类似的事情

float func_x(float a){
  float b;
  func_x2((void *)&a, (void *)&b);
  return b;
}
于 2013-05-03T09:13:21.447 回答
0

你想要的完全不可能。您可以重命名/删除原始 func_x 并将其替换为仅调用 func_x2 的函数。

于 2013-05-03T09:12:00.993 回答
0

一种想法是使用正则表达式来替换旧函数的所有出现。

此正则表达式捕获问题中给出的示例

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

然后你可以用这样的东西来替换它

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

当然,你可能需要稍微调整一下这个正则表达式,并且正则表达式有不同的风格,但它让你知道你可以做什么。

于 2013-05-03T09:12:18.293 回答
0

不可能,因为您也在尝试修改函数定义和实现。!

于 2013-05-03T09:20:49.783 回答