Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Podział kodu na pliki i błąd "multiple definition (...)"

Ostatnio zmodyfikowano 2010-07-29 22:45
Autor Wiadomość
ison
Temat założony przez niniejszego użytkownika
[C++] Podział kodu na pliki i błąd "multiple definition (...)"
» 2010-07-29 17:37:32
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
C/C++
#include <cstdio>
#include "Untitled1.cpp"

int main()
{
    printf( "%d", a() );
    while( 1 );
   
}

Untitled1.cpp
C/C++
int a()
{
    return 5;
}


błędy:

multiple definition of `a()'
first defined here
ld returned 1 exit status
P-20275
Pirotechnik
» 2010-07-29 18:02:03
przecież funkcje Main masz typu int więc czemu nie masz tam return'a??
P-20278
ison
Temat założony przez niniejszego użytkownika
» 2010-07-29 18:07:06
bo nie trzeba... nie każda funkcja, która nie jest voidem musi coś zwracać :p
P-20279
lenrokskate
» 2010-07-29 18:07:08
po co include'dujesz plik cpp?

Poprawne rozwiązanie wygląda tak:
C/C++
/**          **
** main.cpp **
**          **
*/

#include <iostream>
#include "funkcja.hpp"

int main()
{
    std::cout << funkcja();
    getchar();
    return 0;
}
C/C++
/**             **
** funkcja.hpp **
**             **
*/

#ifndef FUNKCJA_INCLUDE
#define FUNKCJA_INCLUDE

int a();

#endif //FUNKCJA_INCLUDE
C/C++
/**             **
** 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ć
P-20280
ison
Temat założony przez niniejszego użytkownika
» 2010-07-29 18:11:59
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
P-20281
lenrokskate
» 2010-07-29 18:15:53
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
P-20282
ison
Temat założony przez niniejszego użytkownika
» 2010-07-29 18:20:15
mam code::blocks :p

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?
P-20283
lenrokskate
» 2010-07-29 19:43:26
przy tworzeniu binarki linker odpowiednio tworzy powiązania
P-20285
« 1 » 2
  Strona 1 z 2 Następna strona