błąd przy deklaracji w bibliotekach

0

Witam, mam 3 pliki; jeden główny, i 2 pliki biblioteki (h i cpp). Oto ich cała treść:


<b>main.cpp</b>
#include "xxx.h"
int main(int argc, char *argv[])
{
    printf("%d\n",xxx1);
}

<b>xxx.h</b>
#ifndef _XXX_
#define _XXX_

int xxx1;

#endif

<b>xxx.cpp</b>
#include "xxx.h"

gdy kompiluje wyrzucany jest błąd

multiple definition of xxx1

ale za to, gdy usunę z pliku xxx.cpp odwołanie do xxx.h (czyli xxx.cpp będzie pusty) to błędu nie ma, tyle że z oczywistych względów to odwołanie jest jak najbardziej porządane...

0

A, no i wszystko kompiluje w Dev-Cpp 5 jako jeden projekt.

0

widze braki na temat zasiegu zmiennych jak deklaruejsz zmienna poza jaka kolwiek funkcja jest traktowana jako zmienna globalna i taka deklaracja moze wystapic tylko raz nie wazne w jakim pliku byla zadeklarowana jesli tworzysz aplikacje wielomodulowa(skladajaca sie z paru plikow .cpp) i deklarujesz zmienna globalna aby moc uzywac ja w innych plikach po prostu dopisujesz na poczatku kazdego pliku juz pozniej:
extern typ nazwa_zmiennej;
to informuje kompilator ze dana zmienna istnieje (jest zadeklarowana ale w innym pliku)
To ze dales warunek w pliku naglowkowym nie zwalnia go od deklarowania zmiennej zarowno w main.cpp jak i cos.cpp i inne cos.cpp gdzies dolaczasz ten plik za pomoca #include poniewaz #define nie ma zasiegu globalnego i definicja jest tylko widoczna w obrebie danego pliku .cpp wiec wykonujesz lacznie dwie deklaracje tej zmiennej a jak juz wspomnialem deklaracja zmiennej globalnej moze byc tylko jedna pozniej w kolejnych plikach uzywasz slowa kluczowwego extern aby poinformowac kompilator ze uzywasz zmiennej o tej nazwie ktora jest zadeklarowana ale w innym pliku takze:

w pliku h:
kazda zmienna ktora chcesz aby byla dzielona pomiedzy plikami .cpp dajesz ze slowem kluczowym extern ale w ktoryms pliku cpp w Twoim wypadku np xxx.cpp musisz ja normalnie zadeklarowac w innym wypadku jesli w zadnym z plikow tej deklaracji nie bedzie kompilator wyrzuci Tobie blad ze dana zmienne niby istnieje ale nie jest nigdzie zadeklarowana
Mam nadzieje ze teraz jest to jasne jak to dziala jesli chcesz aby dana zmienna byla zmienna globalna ale widoczna tylko w obrebie pliku w ktorym zostala zadeklarowna uzywasz wtedt slowa kluczowego static

0

Czyli jak rozumiem, w każdym pliku cpp powinienem wypisać wszystkie dostępne zmienne globalne z dopiskiem extern (oczywiście "oryginał" bez extern)? A przykładowo, jeśli chciałbym użyć jakiegoś modułu cpp ,o którego działaniu nic nie wiem a on na swoje własne potrzeby będzie miał globalną zmienną? czy w takim razie powinienem do każdego innego pliku podopisywać te zmienne? A jak takich plików jest powiedzmy 30?

Ha, już wiem; w .h robię extern zmienna a w .cpp robię definicję tej zmiennej. Ale proste :)

Niezły bilans, jak do teraz 4/5 postów moje...

1 użytkowników online, w tym zalogowanych: 0, gości: 1