2010-04-21 15 views
6

W mojej bazie kodu stwierdzam, że dwa moduły mają struktury o tej samej nazwie. Daje to błąd konfliktu nazw. Czy istnieje sposób rozwiązania tego problemu bez zmiany kodu?Jak rozwiązać dwie struktury o tej samej nazwie?

+0

Co jest nie tak ze zmianą kodu? –

+0

Gdybym mógł, musiałbym. :) Przepraszam Neil, W moim przypadku to nawet nie jest opcja. Integruję dwa różne moduły, oba poza moją kontrolą i powodują to. – Jay

Odpowiedz

9

To straszne hack, ale byłoby możliwe użycie makra przedefiniować nazwę struktury, tak jak

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

że prawdopodobnie chcesz zmienić nazwę struct dla obu nagłówki dać błędy, gdy ktoś używa złego nieuchronnie struct, może w nagłówku owijarki jak

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

Pamiętaj undef makro, więc nie dostać losowe zamienniki całym kodzie.

+0

Nie powiedziałbym tego tak okropnie. Kiedyś musiałem włączyć do mojego programu dwa skanery generowane przez lex i starły się one z dużą liczbą symboli, więc użyłem podobnej sztuczki i zadziałało to jak czar. – qrdl

+0

Myślę, że tym, o co więcej trzeba się martwić, jest to, że ktoś jest zdezorientowany przez zmianę nazwy struktur, ponieważ prawdopodobnie te zderzające się nazwy pochodzą z zewnętrznego źródła. Dokumentacja wywołań funkcji itp. Nie pasowałaby już do rzeczywistych prototypów, więc każdy użytkownik musiałby jasno określić, co się stało. –

1

Nie przychodzą mi do głowy żadne dobre pomysły. Oto dwa nie-tak-dobrych:

  • Jeśli jesteś bardzo szczęśliwy, można segregować kod tak, że żaden moduł każdy musi mieć dostęp do obu typów konstrukcji w jednym czasie, to tylko zawierać Odpowiedni nagłówek i gotowe. Jest to najeżone niebezpieczeństwem, a będzie koszmarem wymagającym utrzymania: każdy, kto przyjdzie po ciebie, będzie miał przekleństwo twoje imię i wszystkich twoich potomków do siódmego pokolenia.

  • Jeśli kod jest w porządku, możesz spróbować kompilować za pomocą kompilatora C++ i owijać jedną lub więcej obraźliwych struktur w przestrzeni nazw. To wprowadza problemy ze wszystkimi wybrednymi niewielkimi różnicami w dwóch językach (reguły dotyczące odlewania, class jako zastrzeżone słowo, itd.), Więc prawie na pewno narusza to twoją prośbę o niezmienianie kodu.

Powodzenia.

Powiązane problemy