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

question-closed Includowanie plików

Konferencja JOIN! 2018
0 głosów
83 wizyt
pytanie zadane 17 sierpnia 2017 w C i C++ przez Kacper777777 Bywalec (2,410 p.)
zamknięte 17 sierpnia 2017 przez Kacper777777

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

+1 głos
odpowiedź 17 sierpnia 2017 przez adrian17 VIP (141,640 p.)
wybrane 17 sierpnia 2017 przez Kacper777777
 
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 Kacper777777 Bywalec (2,410 p.)
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 Mądrala (7,110 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ź 100 wizyt
0 głosów
1 odpowiedź 61 wizyt
pytanie zadane 23 lipca w PHP, Symfony, Zend przez Maikel11 Początkujący (340 p.)
0 głosów
0 odpowiedzi 65 wizyt
pytanie zadane 19 maja w HTML i CSS przez Martin Koszmider Początkujący (360 p.)
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

55,376 zapytań

99,732 odpowiedzi

205,204 komentarzy

27,305 pasjonatów

Przeglądających: 339
Pasjonatów: 18 Gości: 321

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...