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

[C++] Użycie funkcji z innego pliku w WinApi

Ostatnio zmodyfikowano 2012-11-13 15:59
Autor Wiadomość
hit
Temat założony przez niniejszego użytkownika
[C++] Użycie funkcji z innego pliku w WinApi
» 2012-11-13 11:29:17
Witam,

piszę program w Visualu studio 2010, używając WinApi. Natknąłem się na problem używania tych samych zmiennych w kilku plikach, jednak znalazłem rozwiązanie tego za pomocą 'extern'. Jednak pisząc dalej, chciałem stworzyć funkcje w innych plikach, żeby było bardziej przejrzyście, ale natknąłem się na taki błąd:

error LNK2005: "int __cdecl funkcja(void)" (?funkcja@@YAHXZ) already defined in plik1.obj

z czego wynika, że funkcja już jest zdefiniowana ale nic takiego nie miało miejsca. W kodzie wygląda to tak, że w osobnym pliku mam przykładową funkcję:

int funkcja()
{
return 5;
}

a w pliku z główną funkcją zwykłe jej wywołanie funkcja();
Gdzie popełniam błąd?

Edit:

Kiedy deklaruję zmienną w pliku głównym i z pomocą 'extern' używam jej w innym pliku to jest ok, natomiast w drugą stronę tzn. deklaracja zmiennej w pliku pobocznym i użycie w głównym też pokazuje taki błąd 'already defined...'.
P-69105
pekfos
» 2012-11-13 12:54:09
Najpierw prawidłowe pojęcia:
C/C++
extern int zmienna; // DEKLARACJA - informuje kompilator o istnieniu zmiennej.
int zmienna /* = 123 */; //DEFINICJA - tworzy zmienną.
Definicja jest jedna, deklaracji może być wiele.
C/C++
void fun(); // DEKLARACJA

void fun()
{ // DEFINICJA
}

error LNK2005: "int __cdecl funkcja(void)" (?funkcja@@YAHXZ) already defined in plik1.obj
Ten błąd mówi, że masz więcej niż jedną definicję funkcji. Może umieściłeś definicje w pliku nagłówkowym?
P-69106
hit
Temat założony przez niniejszego użytkownika
» 2012-11-13 13:07:11
No właśnie nie umieściłem i jakkolwiek bym swojej funkcji nie nazwał to pojawia się taki sam błąd. Próbowałem teraz deklarować jakąkolwiek funkcję w pliku głównym, a zdefiniować ją w pobocznym, co zresztą jest moim celem, ale nadal wyskakuje ten błąd. Czy są może konkretnie określone miejsca gdzie należy zadeklarować nazwy funkcji, żeby działały poprawnie w kilku plikach?

Edit:

Ok, zainteresowałem się już artykułem o dzieleniu programu na moduły, jakby mi to nie pomogło to wtedy napiszę ponownie. Dzięki pekfos!

Edit2:

Niestety.. Zrobiłem, zgodnie z artykułem z tego portalu plik nagłówkowy, w którym zamieściłem deklaracje funkcji, oraz plik *.cpp w którym ją zdefiniowałem i pokazuje taki sam błąd:

error LNK2005: "int __cdecl funkcja(void)" (?funkcja@@YAHXZ) already defined in plik1.obj
P-69107
pekfos
» 2012-11-13 13:50:20
No to pokaż kod :]
P-69108
hit
Temat założony przez niniejszego użytkownika
» 2012-11-13 14:14:56
Zrobiłem już tak, że w pliku głównym WinApi.cpp mam tak:

C/C++
#include "stdafx.h"
#include <iostream>
#include <process.h>
#include <windows.h>
#include "fun.h"

w pliku fun.h :

C/C++
#ifndef  fun_h
#define fun_h
#include "stdafx.h"

int funkcja( int z );

#endif

oraz fun.cpp

C/C++
#include "stdafx.h"
#include "fun.h"
#include "WinApi.h"

int funkcja( int a )
{
    return a + 3;
}
Oczywiście ta prymitywna funkcja służy tylko do sprawdzenia poprawności kompilacji.

I teraz już działa ( wcześniej załączałem też drugi fun.cpp w WinApi.cpp ). Zatem chciałem tylko jeszcze zapytać odnośnie zmiennych. Jeżeli mam zdefiniowaną jakąś zmienną w pliku WinApi.cpp, to w każdym innym pliku którym ją używam muszę mieć osobną deklarację?
P-69110
pekfos
» 2012-11-13 15:59:41
Deklaracja może być w pliku nagłówkowym.
P-69116
« 1 »
  Strona 1 z 1