c预处理器-用c++#define替换对变量的所有引用

c preprocessor - Replacing All References to a Variable By C++ #define

本文关键字:变量 引用 替换 处理器 预处理 c++#define      更新时间:2023-10-16

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

#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++,这暂时超出了我的掌握范围。

它的主要问题是#define是邪恶的。这不会提高代码的可读性,所以我建议您咬紧牙关,使用编辑器的查找/替换函数。

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

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

您最好将其替换为函数,而不是通过宏映射函数。

IMHO,如果代码足够旧并且运行良好,则最好不要更改任何内容。遵循软件行业的规则,"在需要之前不要碰任何东西。"

为什么你想浪费时间/精力来更改遗留代码并在各种场景中进行测试,而不是学习开发新的东西。如果某个东西因更改而损坏,那么你最终会花更多的时间来修复它,而不是实际维护。

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

例如,你可以很容易地避免像这样的例子被修改

func1("legacyGlobalVariable")(23)

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