Serwis został przeniesiony pod nową domenę: http://cpp0x.pl/
PowrótPowrótHistoria odwiedzonych stron
AutorWiadomość
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ć język

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 język

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

12



Statystyki tematuOstatnio przeczytali
Czytało użytkowników:21dmx81, 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



PowrótPowrótHistoria odwiedzonych stron
Panel Logowania
Login:
Hasło:

Użytkowników
Obecnie aktywnych:20
Zalogowanych:1
Zarejestrowanych:4367
Ostatnie 24h:531
Non-cookie 24h:2664
Wszystkich:214129
Ostatnia Aktualizacja
2010-09-01 19:27:34 (4 dni temu)
Ostatnio aktywni
fish132 min
Mateusz12420 min
SeaMonster13125 min
Gronek862437 min
wiew84 min
Koni94 min
wiewiorka2 godz
lenrokskate9 godz
dmx8111 godz
steckel12 godz
pixelmaster15 godz
maciejo15 godz

Wynajem Sopot - wakacje
Pokój 2 osobowy 130zł/doba;
Lokalizacja: Sopot


O portaluArchiwumHistoriaIndeksRegulaminWyszukiwarkaLinki
Kurs HTML - strona WWW za darmoRestauracja "ATOL" - SopotValid HTML 4.01 TransitionalValid CSS!HTML CSS JavaScript FLASH PHP MySQL