• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Includowanie plików

VPS Starter Arubacloud
0 głosów
260 wizyt
pytanie zadane 17 sierpnia 2017 w C i C++ przez niezalogowany
zamknięte 17 sierpnia 2017

Otóż chciałbym mieć bibliotekę, w której mam zarówno zwykłe funkcje jak i szablonowe. Wiem, że z okreslonych przyczyn definicje funkcji szablonowych muszą być w pliku .h, a tych zwykłych w oddzielnym pliku .cpp. Ale przecież 

#ifndef EXAMPLE_H
#define EXAMPLE_H

//zawartosc

#endif // EXAMPLE_H

działa w ten sposób, że jak coś już zostało załączone, to drugi raz nie będzie dzięki temu strażnikowi nagłówka.

Więc dlaczego to działa tylko wtedy gdy mam bibliotekę podzieloną na dwa pliki i w .h tylko nagłówki, a w .cpp definicje? Dlaczego gdy dam definicje w .h to mi wyrzuca "multiple definition of..." ?

komentarz zamknięcia: Znaleziono rozwiązanie

3 odpowiedzi

0 głosów
odpowiedź 17 sierpnia 2017 przez adrian17 Ekspert (344,100 p.)
wybrane 17 sierpnia 2017
 
Najlepsza

działa w ten sposób, że jak coś już zostało załączone, to drugi raz nie będzie dzięki temu strażnikowi nagłówka.

Tak, ale to działa w skali kompilacji pojedynczego .cpp.

Jeśli wrzucisz definicję do nagłówka, kompilowanie każdego .cpp doda definicję tej funkcji do odpowiadającego pliku wynikowego. Przy linkowaniu, linker patrzy na wszystkie pliki pośrednie razem, widzi w nich kilka definicji tek samej funkcji, więc zgłasza błąd "multiple definition of...".

0 głosów
odpowiedź 17 sierpnia 2017 przez niezalogowany
W takim razie chyba postąpię tradycyjnie, że będę miał pliki example.h i example.cpp, ale żeby nie było bałaganu (czyli deklaracji przeplatanych definicjami szablonów) to zrobię plik templatesexample.h i załączę do example.h
–2 głosów
odpowiedź 17 sierpnia 2017 przez bartolinciu Dyskutant (7,580 p.)
Strażnik broni tylko przed dwukrotnym wklejeniem pliku nagłówkowego do tego samego pliku z kodem. Jeśli masz definicję funkcji w pliku .h i dołączasz go do dwóch plików .cpp to wtedy ta definicja pojawia się ogólnie dwa razy w kodzie. Jeśli chodzi o funkcje szablonowe, to mogą one być w pliku .h bo funckja staje się kompletna dopiero gdy wstawimy odpowiednie wartosci do szablonu.

Podobne pytania

0 głosów
1 odpowiedź 273 wizyt
pytanie zadane 19 września 2016 w PHP przez Grzdaczek Obywatel (1,070 p.)
0 głosów
1 odpowiedź 357 wizyt
pytanie zadane 22 maja 2022 w PHP przez Grzegorz Mikina Dyskutant (8,060 p.)
+2 głosów
2 odpowiedzi 230 wizyt
pytanie zadane 21 kwietnia 2022 w HTML i CSS przez Maxxxii Obywatel (1,260 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...