Autor Wątek: Already defined in ...  (Przeczytany 2025 razy)

Offline szymat

  • Użytkownik

# Listopad 02, 2010, 18:26:55
Witam!

Stworzyłem pewien header:
//Jakisheader.h
#ifndef HEADERDEF
#define HEADERDEF

void scrollCameraX(float posX) {
...
}

#endif
//Main.cpp
#include "Jakisheader.h"
...
// Jest wywołana funkcja scrollCameraX
//player.cpp
#include "Jakisheader.h"
...
// Jest wywołana funkcja scrollCameraX

1>player.obj : error LNK2005: "void __cdecl scrollCameraX(float)" (?scrollCameraX@@YAXM@Z) already defined in Main.obj

Problem w tym, że 2 razy definiuję funkcję. Jak ominąć ten problem (includowałem do 2 plików cpp)?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline yarpen

  • Użytkownik

# Listopad 02, 2010, 18:36:49
Trzy sposoby (w kolejnosci preferencji):
- zdefiniuj funkcje w jednym pliku .cpp, nie w naglowku (czyli deklaracja w .h, cialo w .cpp),
- dodaj inline
- dodaj static

Offline szymat

  • Użytkownik

# Listopad 02, 2010, 18:39:43
inline pomogło, dzięki!

Offline Xirdus

  • Redaktor

# Listopad 02, 2010, 18:40:22
@yarpen
Warto dodać, że inline'ować powinno się tylko króciutkie funkcje. I odwrotnie: króciutkie funkcje powinno się inline'ować.

Offline Liosan

  • Redaktor

# Listopad 02, 2010, 18:42:49
@up Bzdura, nie ma co uogólniać. Długość funkcji nie jest jedynym wyznacznikiem.

@szymat - polecałbym raczej przenieść definicję do pliku .cpp :)

Liosan

Offline szymat

  • Użytkownik

# Listopad 02, 2010, 19:18:59
Ale jest dobrze, działa. Dziwie się, że na to wcześniej nie wpadłem...

Offline t4fun

  • Użytkownik

# Listopad 02, 2010, 19:38:34
Ale nie rozumiesz dlaczego zadziałało, i jak nie zrozumiesz i wszędzie będziesz wsadzał inline to nie zrobisz kariery jako programista.

Offline Xirdus

  • Redaktor

# Listopad 02, 2010, 20:01:56
@up Bzdura, nie ma co uogólniać. Długość funkcji nie jest jedynym wyznacznikiem.
Racja, zapomniałem jeszcze o miejscach krytycznych dla wydajności.

szymat, żebyś wyniósł coś z tej lekcji, musisz dowiedzieć się, co robi inline. Otóż inline powoduje, że (o ile to możliwe) gdy funkcja jest użyta, to zamiast ją wywoływać, kompilator kopiuje w odpowiednie miejsce jej kod. Rozwiązuje to problemy z linkowaniem, ponieważ na tym etapie tej funkcji właściwie już nie ma ;)

Offline hashedone

  • Użytkownik

# Listopad 11, 2010, 21:18:05
Ale jest dobrze, działa. Dziwie się, że na to wcześniej nie wpadłem...
Jest dobrze bo działa to znaczy mniej więcej tyle co "może jest dobrze, ale działa". Jeśli na takim stwierdzeniu chcesz budować program to... to go nie skończysz.