用C ++ #define替换变量的所有引用

时间:2011-06-16 11:54:35

标签: c++ c-preprocessor

不确定是否有人有维护旧代码的经验。在一些旧代码中,我在很多地方引用了一个全局变量。我想将所有对全局变量的引用替换为其他东西,比如函数调用。我可以在每个源文件中通过简单的#define来完成吗? e.g。

#define legacyGlobalVariable func1("legacyGlobalVariable")

我的 func1()将接受旧变量的名称,并返回与 legacyGlobalVariable 相同类型的内容。

我知道#define可以替换构成令牌的 legacyGlobalVariable 。但我不确定是否有任何特殊情况,这种简单的技术无法处理。例如,我知道我需要阻止这一点:

legacyGlobalVariable(23);// a badly named function same name as my global var

成为

func1("legacyGlobalVariable")(23);//but at least, it cannot compile

这种简单的技术还有其他可能的问题吗?有没有人尝试过使用它?我知道要验证所有可能的情况确实需要熟悉C ++,这是我暂时无法掌握的。

4 个答案:

答案 0 :(得分:3)

它的主要问题是#define is evil。这不会提高代码的可读性,所以我建议只需咬一下子弹并使用编辑器的查找/替换功能。

答案 1 :(得分:1)

此简单技术还有其他可能出现的问题吗?
是!参数类型检查怎么样?
对于函数参数,检查类型,如果类型不匹配,编译器将返回错误。对于宏,没有这种类型检查。

此外,宏通常会给你带来许多难以想象的副作用。

最好用函数替换它,而不是通过宏映射函数。

答案 2 :(得分:1)

恕我直言,如果代码足够老并且工作正常,那么最好不要改变任何东西。遵循软件行业规则,“在需要之前不要触摸任何东西。”

为什么您要浪费时间/精力来更改遗留代码并在各种情况下对其进行测试,而不是学习开发新内容。如果由于更改而导致某些内容被破坏,那么您最终将花费更多时间来修复而不是实际维护。

答案 3 :(得分:0)

您可以使用某些脚本语言,例如perl的 并自动查找和替换, 这会给你更多的控制权

e.g。您可以轻松避免修改此类实例

func1的( “legacyGlobalVariable”)(23)

它也为你节省了很多时间。