我有很多使用表单宏的遗留代码:
#define FXX(x) pField->GetValue(x)
宏强制变量pField在范围内:
.....
FIELD *pField = ....
.....
int i = FXX(3);
int j = FXX(5);
有没有办法在不触及用户代码的情况下更换宏?
由于FXX(x)具有函数调用样式,我考虑了内联函数或类似函数。
UPD: 人们只是习惯了宏,我想保持原样。
答案 0 :(得分:3)
如何使用 find&在您喜欢的编辑器中替换功能...我认为它会在您的问题中给出的示例中正常工作。将FXX
替换为pField->GetValue
,然后移除#define
行
答案 1 :(得分:3)
是什么 pField
(除了匈牙利系统憎恶的一个很好的例子)?如果它是偶然的,它是一个全局变量或单个或者我们只需要其中一个的东西,我们可以做一个漂亮的技巧:
int FFX(int x)
{
static FIELD *pField = ...; // remove this line if pField is global
return pField->GetValue(x);
}
将int
类型更改为您需要操作的任何类型,如果您需要它以支持多种类型,甚至可以更改模板。
@epatel建议的另一种选择是使用您喜欢的文本编辑器的查找和替换,只需将所有FFX(x)
行更改为pField->GetValue(x)
,从而消除宏调用你的代码。如果你想保持函数调用,你可以将FFX(x)
更改为FFX(pField, x)
并更改宏以获取两个参数(或将其更改为带有两个参数的函数)。但是你可能只是在那时取出宏。
第三种选择,不是解决未破坏的问题。宏不是特别好,但是你可以通过尝试删除它来引入更大的问题。宏并不是撒旦的产物(虽然这个地方至少有几个亲戚)。
答案 2 :(得分:1)
您需要的是一个依赖于定义变量的函数。唯一的方法是在与函数相同的范围内声明该变量。但是,然后你的函数将使用那个函数而不是从函数调用的地方声明的函数。
所以我相信它无法完成。
答案 3 :(得分:0)
好吧,如果你可以把这个函数定义放在pField已经在范围内的地方:
int FXX(int x) { return pField->GetValue(x); }
否则,在不影响现有代码的情况下,无法将pField放入函数中。
这可能是使用宏是最佳选择的情况。宏可能是邪恶的,但它们有时是必要的。见http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.15
答案 4 :(得分:0)
我会原样保留它,但仅仅是为了讨论,并且根据代码的哪些部分是“不可触及的”,你可以定义一个函数,它接受一个pField并在变量创建后进行初始化范围:
class FFX_t {
FFX_t( FIELD * pField ) : field_(pField) {}
int operator()( int index ) {
return field_->GetValue( index );
}
private:
FIELD *field_;
};
// usage:
void f() {
FIELD * pField = //...
FFX_t FFX(pField); // added after pField construction
// ...
int a = FFX(5);
}
但是我坚持认为,当它不会真正添加任何值时,为了它而改变工作代码是没用的。