寻找将取代功能的宏

时间:2013-05-03 09:03:57

标签: c++ c macros legacy side-effects

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

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,所以代码根本不会改变?有人试过吗?

问候 Ĵ

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

你想要什么是不可能的。你可以重命名/删除原始的func_x并用一个只调用func_x2的函数替换它。

答案 3 :(得分:0)

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

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

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

然后你可以用这样的东西用

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

当然,您可能需要稍微调整一下这个正则表达式,并且有不同的正则表达式,但它可以让您了解自己可以做什么。

答案 4 :(得分:0)

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