Data: 2010-07-29 17:37:32
ison | [C++] Podział kodu na pliki i błąd "multiple definition (...)"
witam, wiem że to jest bardzo głupie pytanie i jest na nie pewnie banalna odpowiedź. Czy ktoś mógłby mi powiedzieć dlaczego ten kod się nie kompiluje?
main.cpp
#include <cstdio> #include "Untitled1.cpp"
int main() { printf("%d", a()); while(1); }
Untitled1.cpp
int a() { return 5; }
błędy:
multiple definition of `a()' first defined here ld returned 1 exit status
| Data: 2010-07-29 18:02:03
Pirotechnik |
przecież funkcje Main masz typu int więc czemu nie masz tam return'a?? | Data: 2010-07-29 18:07:06
ison |
bo nie trzeba... nie każda funkcja, która nie jest voidem musi coś zwracać  | Data: 2010-07-29 18:07:08
lenrokskate |
po co include'dujesz plik cpp?
Poprawne rozwiązanie wygląda tak:
/** ** ** main.cpp ** ** ** */
#include <iostream> #include "funkcja.hpp"
int main() { std::cout<<funkcja(); getchar(); return 0; }
/** ** ** funkcja.hpp ** ** ** */
#ifndef FUNKCJA_INCLUDE #define FUNKCJA_INCLUDE
int a();
#endif //FUNKCJA_INCLUDE
/** ** ** funkcja.cpp ** ** ** */
#include "funkcja.hpp"
int a() { return 5; }
Twój problem polegał na tym, że definiowałeś funkcję w dwóch różnych pilkach cpp i linker nie wiedział którą ma uruchomić
| Data: 2010-07-29 18:11:59
ison |
dzięki, czy jeśli dołączam plik nazwa.hpp to on automatycznie szuka pliku nazwa.cpp i go z nim kojarzy? bo ani w main ani w twoim pliku hpp nie zostało użyte słowo funkcja.cpp
p.s. chyba jednak zmienie IDE, bo w DEV'ie sie praktycznie NIE DA robić projektów | Data: 2010-07-29 18:15:53
lenrokskate |
to znaczy: do wywołania funkcji wystarczy ci sama deklaracja funkcji (to znaczy bez { i }), pod warunkiem, że jego definicja (czyli {}) jest w innym (lub tym samym) pliku cpp
po prostu musisz sobie wyobraźić, że main.cpp to nie jest główny plik, tylko wszystkie są sobie równe, a wywołanie programu, to zwykłe użycie funkcji main()
ściągnij Code::Blocks, genialne IDE szczególnie pod Linem, a pod Winem tylko tyćkę gorsze, ale i tak cudo | Data: 2010-07-29 18:20:15
ison |
mam code::blocks 
no dobra ale skąd on wie że definicja funkcji a() znajduje się akurat w funkcja.cpp a nie niewoadomoco.cpp? przecież funkcja.cpp nie jest w żaden sposób includowana ani w mainie ani w funkcja.hpp. Zgodnie z zasadami logiki funkcja a() w twoim przykładzie nie ma definicji (bo funkcja.cpp nie jest wcale powiązana z projektem), ale tak nie jest. Dlaczego? | Data: 2010-07-29 19:43:26
lenrokskate |
przy tworzeniu binarki linker odpowiednio tworzy powiązania | |
| Statystyki tematu | Ostatnio przeczytali |
|---|
| Czytało użytkowników: | 21 | dmx81, fish13, pekfos, wojos, pixelmaster, lenrokskate, madmike44, TheLukon, michalp, McAffey, SeaMonster131, Saiph, malan, VND, Iname (√ιק), ison | | Przeczytało użytkowników: | 16 | | Czytało osób ogólnie: | 29 | | Przeczytało osób ogólnie: | 20 |
| Ostatnia Aktualizacja| 2010-09-01 19:27:34 (4 dni temu) | |
| Ostatnio aktywni |
|---|
| fish13 | 2 min | | Mateusz124 | 20 min | | SeaMonster131 | 25 min | | Gronek8624 | 37 min | | wiew | 84 min | | Koni | 94 min | | wiewiorka | 2 godz | | lenrokskate | 9 godz | | dmx81 | 11 godz | | steckel | 12 godz | | pixelmaster | 15 godz | | maciejo | 15 godz |
|