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.
- 1. dwie funkcje o tej samej nazwie w R
- 2. framework entity 4.1 dwie tabele o tej samej nazwie właściwości
- 3. Metoda nadpisywania Jython o tej samej nazwie
- 4. Excel.Workbook.SaveAs (...) z plikiem o tej samej nazwie
- 5. Typedef i enum o tej samej nazwie?
- 6. Android Gradle moduły o tej samej nazwie
- 7. PHP nieaktualne: Metody o tej samej nazwie
- 8. Kilka pól wyboru o tej samej nazwie
- 9. Funkcja i zmienna o tej samej nazwie
- 10. Definiowanie tego samego komponentu Spring bean o tej samej nazwie
- 11. Jak mogę załadować dwa zadania zadawania o tej samej nazwie?
- 12. Jak wybrać zmienne (bez tekstu) o tej samej nazwie?
- 13. Jak odwołać wartości o tej samej nazwie z różnych modułów
- 14. Używanie dwóch bibliotek DLL o tej samej nazwie i tej samej przestrzeni nazw
- 15. Przekaż funkcję o tej samej nazwie w React
- 16. Dziedziczona klasa C++ ma członka o tej samej nazwie
- 17. Używanie klasy w przestrzeni nazw o tej samej nazwie?
- 18. W jaki sposób WZP może rozpoznać dwie klasy o tej samej nazwie, ale w różnych pakietach?
- 19. Czy istnieją dwie różne wersje tych samych bibliotek (o tej samej nazwie) w aplikacji?
- 20. Katalog bezwersyjny SVN o tej samej nazwie już istnieje
- 21. Scal kolumny w ramach DataFrame o tej samej nazwie
- 22. Obsługa parsera Jacksona nazw wielu pól o tej samej nazwie
- 23. Ukrywanie wszystkich elementów o tej samej nazwie klasy?
- 24. Automatyczne tworzenie #region o tej samej nazwie w #endregion
- 25. PHP Przesyłanie i nadpisywanie pliku o tej samej nazwie
- 26. Usuwanie plików cookie o tej samej nazwie, ale różnych ścieżkach.
- 27. Selen - lokalizowanie wielu elementów o tej samej nazwie klasy
- 28. Funkcja i struktura o tej samej nazwie w C++
- 29. Wykrywanie liczby uruchomionych procesów o tej samej nazwie
- 30. Wiele grup przycisków radiowych o tej samej nazwie
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