删除遗留代码中的宏

时间:2009-11-11 21:57:42

标签: c++ macros c-preprocessor

我有很多使用表单宏的遗留代码:

#define FXX(x) pField->GetValue(x)

宏强制变量pField在范围内:

.....
FIELD *pField = ....
.....
int i = FXX(3);
int j = FXX(5);

有没有办法在不触及用户代码的情况下更换宏?

由于FXX(x)具有函数调用样式,我考虑了内联函数或类似函数。

UPD: 人们只是习惯了宏,我想保持原样。

5 个答案:

答案 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);
}

但是我坚持认为,当它不会真正添加任何值时,为了它而改变工作代码是没用的。