Błąd wielu definicji w C++
Gdy funkcja lub zmienna ma kilka definicji w różnych plikach źródłowych, procedura łączenia powoduje błąd wielokrotnego definicji. Aby zapewnić jednolitość i dokładność programu, Linker oczekuje tylko jednej definicji we wszystkich plikach źródłowych.
Zazwyczaj błąd wygląda tak:
Błąd: wielokrotna definicja „Function_name”Dla każdego programisty C ++ ma kluczowe znaczenie, aby zrozumieć przyczynę tego błędu i wiedzieć, jak go naprawić.
Czynniki, które prowadzą do wielu błędów definicji w C++
Wiele błędów definicji może wystąpić w twoim kodzie C ++ z kilku powodów, jak omówiono poniżej:
1: Wiele definicji tej samej funkcji lub zmiennej w pliku źródłowym
Jeśli przypadkowo zdefiniujesz tę samą funkcję lub zmienną wielokrotnie w tym samym pliku źródłowym, napotkasz błąd wielokrotnego definicji.
2: Funkcja lub zmienna zdefiniowana w pliku nagłówka
Gdy funkcja lub zmienna zostanie zadeklarowana w pliku nagłówka, a do tego pliku nagłówka jest odwoływa się liczne pliki źródłowe, każdy plik źródłowy z nagłówkiem będzie również zawierał definicję funkcji lub zmiennej. To generuje błąd wielu definicji.
3: Wielokrotnie deklarowanie tej samej funkcji lub zmiennej w tym samym pliku źródłowym
Jeśli przypadkowo zadeklarujesz tę samą funkcję lub zmienną wiele razy w tym samym pliku źródłowym, napotkasz błąd wielokrotnego definicji podczas łączenia. Wynika to z faktu, że Linker oczekuje tylko jednej definicji dla każdej funkcji lub zmiennej we wszystkich plikach źródłowych.
Napraw błąd z wieloma definicjami funkcji w C++
Do ustalenia wielu błędów definicji można zastosować następujące techniki w C ++:
1: Użyj prototypów funkcji i zmiennych zewnętrznych
Jedną techniką naprawy wielu błędów definicji w C ++ jest deklarowanie funkcji lub zmiennej za pomocą prototypów funkcji lub zmiennych zewnętrznych, zamiast określania ich w pliku nagłówka. W ten sposób funkcja lub zmienna zostanie zdefiniowana tylko raz w pliku źródłowym, unikając w ten sposób błędu.
Poniżej znajduje się składnia kodu dla powyższego rozwiązania.
// nagłówek.HW powyższej składni funkcja pod jest zadeklarowane w pliku nagłówka za pomocą zewnętrznego słowa kluczowego, które wskazuje, że jest on zdefiniowany gdzie indziej. Rzeczywista definicja jest następnie podana w pliku źródłowym. #ifndef nagłówek_h I #Define Header_H Linie obejmują strażników, które zapewniają, że plik nagłówka jest zawarty tylko raz w tym samym pliku źródłowym, aby uniknąć przedefiniowania funkcji.
2: Wykorzystaj funkcje statyczne lub zmienne
Jeśli funkcja lub zmienna jest używana tylko w jednym pliku źródłowym, deklaruj ją jako statyczną. Ogranicza to jego zakres do bieżącego pliku źródłowego, a linker nie rozważa go podczas łączenia. W ten sposób upewnisz się, że funkcja lub zmienna jest zdefiniowana tylko raz i nie można uzyskać dostępu do innych plików.
Deklarowanie funkcji lub zmiennej jako statyczne ogranicza jej zakres do bieżącego pliku źródłowego i zapewnia, że jest ona zdefiniowana tylko raz, co czyni kod bardziej modułowym i łatwiejszym w utrzymaniu
Ponadto, jeśli masz wiele funkcji w różnych plikach, możesz łatwo je wykorzystać w dowolnym innym projekcie.
Rozważ następującą składnię kodu jako przykład:
// Funkcje.CPPW powyższej składni, "statyczny" Słowo kluczowe służy do zdefiniowania funkcji o nazwie „Raz_used_function”. Do tej funkcji można uzyskać dostęp tylko w tym samym pliku źródłowym i nie można uzyskać dostępu do innych plików, które są połączone z tym plikiem źródłowym. Zapewnia to, że funkcja jest zdefiniowana tylko raz i nie może być modyfikowana lub dostępna przypadkowo z innych części programu.
3: Wdrażaj funkcje inline
Rozważ użycie funkcji wbudowanych dla często wywoływanych, krótkich funkcji. Wyeliminuje to potrzebę osobnej definicji, ponieważ kompilator może bezpośrednio zastąpić wywołanie funkcji kodem funkcji.
Rozważ następującą składnię kodu jako przykład:
// nagłówek.HW powyższej składni słowo kluczowe „wbudowane” służy do zdefiniowania funkcji o nazwie „sub”, która przyjmuje dwa argumenty liczb całkowitych i zwraca ich różnicę. Określając tę funkcję jako wbudowaną, kompilator zastąpi wywołanie funkcji faktycznym kodem funkcji w czasie kompilacji, eliminując potrzebę osobnej definicji funkcji.
4: Użyj przestrzeni nazwisk
Korzystając z przestrzeni nazw, możesz zapobiec znalezieniu wielu definicji o tej samej nazwie. Przestrzenie nazw stanowią sposób na grupowanie powiązanych deklaracji i definicji w jednym nazwanym zakresie, ułatwiając organizowanie i zarządzanie dużymi bazami kodowymi.
Rozważ następującą składnię kodu jako przykład:
// źródło_code_1.CPPW powyższej składni dwa różne pliki źródłowe mają funkcję o nazwie „sub” z tym samym podpisem. Aby zapobiec konfliktom nazewnictwa, każda funkcja jest zdefiniowana w oddzielnej przestrzeni nazw: „źródło_code_1” i „źródło_code_2”. W ten sposób do funkcji można uzyskać z odpowiednich przestrzeni nazw bez powodowania konfliktów nazewnictwa. Podczas wywoływania funkcji z innych części bazy kodowej należy określić przestrzeń nazw, aby wskazać, która wersja funkcji chcesz wywołać.
Wniosek
Kiedy programiści i programiści definiują i używają tej samej funkcji dwukrotnie, system staje się mylony, co prowadzi do typowego błędu wielu definicji funkcji C ++. Ponieważ C ++ może wykazywać nieoczekiwane błędy i wady w plikach, które wydają się być prawidłowe, programiści cieszą się dynamicznym doświadczeniem z tym. Dlatego ten przewodnik wyjaśnił wiele definicji błędu funkcji w C ++, dostarczył składnię rozwiązania i debugował błąd.