2009-11-11 120 views
0

我使用形式的宏有很多的遺留代碼:在舊代碼刪除宏

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

宏力可變pField在範圍:

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

有沒有辦法更換宏,而不觸摸用戶代碼?

由於FXX(x)具有函數調用樣式,所以我想到了內聯函數或類似的東西。

UPD: 人們只是習慣了宏,我想保持原樣。

+0

你想要更換什麼? – Aaron 2009-11-11 22:03:29

+0

我不想在我的代碼中看到#define;) – dimba 2009-11-11 22:05:48

+1

在不改變代碼效果的情況下刪除宏的一種方法是通過預處理器運行它。輸出將是沒有宏的功能相同的代碼。但我懷疑這是一個「修復未被破壞的東西」的情況,它需要更多關於周圍代碼的信息才能回答。 – 2009-11-11 22:05:55

回答

3

如何使用找到&替換函數在你最喜歡的編輯器中......我認爲它會在你給你的問題的例子中正常工作。與pField->GetValue更換FXX然後取出#define

0

好吧,如果你可以把這個函數的定義,其中pField已經在範圍:

int FXX(int x) { return pField->GetValue(x); } 

否則,有沒有辦法讓pField進入功能,不影響現有的代碼。

這可能是一種情況,使用宏是最好的選擇。宏可能是邪惡的,但它們有時是必需的。見http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.15

+0

DProbably不明白你的解決方案 - 如何在FXX()內看到pField? – dimba 2009-11-11 22:23:11

+1

例如,如果pField被定義爲全局。你沒有清楚地表明它的範圍。 – 2009-11-11 22:24:45

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),從而消除了在代碼中宏invokation。如果你想保持一個函數的調用,你可以改變FFX(x)FFX(pField, x)並改變宏以接受兩個參數(或將它改爲一個帶有兩個參數的函數)。但是,你可能只是拿出宏觀的那一點。

第三個選擇是不是要修復那個沒有被破壞的。這個宏並不是特別好,但是你可能會通過嘗試刪除它來引入更大的問題。宏不是撒旦的產物(儘管這個人在地獄裏至少有幾個親戚)。

1

你需要的是一個函數,它依賴於一個被定義的變量。唯一的方法是在與函數相同的範圍內聲明該變量。但是然後你的函數會使用那個函數,而不是從函數調用的地方聲明的函數。

所以我相當有信心它不能完成。

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

但我堅持在改它的緣故工作代碼時,它不會真正增加任何價值是沒用的。