c预处理器-用c++#define替换对变量的所有引用
c preprocessor - Replacing All References to a Variable By C++ #define
不确定是否有人有维护旧代码的经验。在一些旧代码中,我在许多地方引用了一个全局变量。我想将所有对全局变量的引用替换为其他内容,比如函数调用。我可以在每个源文件中通过简单的#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)
它也为你节省了很多时间。
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 如果非动态变量被指针引用,何时超出范围?
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- 地址运算符是否返回变量引用的对象的地址
- 未在另一个函数中设置变量引用的问题
- 英特尔样式内联程序集和 AT&T 样式中的变量引用,C++
- 将成员变量引用为类成员
- 从静态变量引用非静态变量会使非静态变量先于静态变量进行析构函数
- 何时解析 C++11 lambda 表达式中的变量引用
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- C++强制对变量引用进行编译优化,使之成为直接的
- Boost变量引用和相等比较
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员
- 为什么要在Java中生成变量引用数组
- 捕获和调试对移动lambda内部局部变量引用的无效使用
- 在变量初始化后更改变量引用
- 从'C'程序中提取变量定义和变量引用