2010-04-21 10 views
6

在我的代碼庫中,我發現兩個模塊具有相同名稱的結構。這是給名稱衝突錯誤。有沒有辦法解決它,而無需更改代碼?如何解析兩個同名的結構?

+0

更改代碼有什麼問題? – 2010-04-21 15:53:09

+0

如果我能,我會。 :)對不起尼爾,在我的情況下,這甚至不是一個選項。我正在整合兩個不同的模塊,這兩個模塊都不在我的控制之下,而且正在導致它。 – Jay 2010-04-22 10:40:45

回答

9

這是一個可怕的黑客,但它是可以使用宏來重新定義該結構的名稱,像這樣

// a.h 
struct collide { 
    int a; 
}; 

// b.h 
struct collide { 
    float b; 
}; 

// test.c 
#define collide a_collide 
#include "a.h" 
#undef collide 
#include "b.h" 
int main(){ 
    struct a_collide a; 
    struct collide b; 
    return 0; 
} 

你可能會要重命名的結構兩個頭給當有人不可避免地使用了錯誤的結構,也許在包裝頭部像

// wrap_a.h 
#define collide a_collide 
#include "a.h" 
#undef collide 

錯誤記住未定義宏這樣你就不會在你的代碼獲得隨機更換。

+0

我不會說這麼可怕的黑客。一旦我不得不在我的程序中包含兩個由lex生成的scaner,並且他們發生大量符號衝突,所以我使用了類似的技巧,它的工作就像一個魅力。 – qrdl 2010-04-21 06:16:31

+0

我認爲你更擔心的是有人被結構的重命名困惑,因爲這些衝突的名字可能來自外部。函數調用等的文檔將不再與實際的原型相匹配,因此任何用戶都必須清楚發生的事情。 – 2010-04-21 06:30:06

1

沒有想到真正的好主意。這裏有兩個不那麼好的:

  • 如果你很幸運,你可以隔離代碼,以便沒有模塊每一個需要在同一時間訪問這兩種類型的結構,然後只包括適當的標題,並離開你去。這是充滿危險的,是一個可維護性的噩夢:任何追隨你的人將有理由詛咒你的名字和所有你的後代到第七代。

  • 如果代碼是c89ish,您可以嘗試使用C++編譯器編譯並在命名空間中封裝一個或多個違規結構。這引入了兩種語言中所有挑剔的小差異(投射規則,class作爲保留字,等等)的問題,所以它幾乎肯定違反了您的要求而不更改代碼。

祝你好運。