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?
Odpowiedz
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.
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
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. –
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.
Co jest nie tak ze zmianą kodu? –
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