[avr-gcc] programowanie strukturalne vs linker

Nov 18, 2004 4 Replies

Witam, mam kilka funkcji w roznych plikach, i chce w nich skozystac z tablicy wskaznikowo do stringow w pamieci programu. umiescilem taka tablice w pliku naglowkowym dolaczylem do plikow w ktorych siedza funcje ktore kozystaja z tej tablicy i kasztan. Przy kompilacji linker wywala mnostwo dziwnych bledow :( Jak temu zaradzic? Funkcje te sa wywolywane z jednego miejsca i moglbym przekaza tablice przy wywolywaniu, ale nie chce za bardzo komlikowac wywolania :)


U¿ytkownik "Pawel Kurzawa" snipped-for-privacy@kpw.qs.pl> napisa³ w wiadomo¶ci news:cnilni$iak$ snipped-for-privacy@atlantis.news.tpi.pl...

jesli definicje tablicy masz w h i to h includujesz do kilku c to linker widzi wiele obiektow o tej samej nazwie

tablice daj do c a w h daj extern

np.

extern char * tab[10];

w pliku .h masz miec definicje "extern ....".

W jednym z plikow .c masz miec definicje samych zmiennych bez extern.

J.

Błąd. Podstawowa zasada: w plikach nagłówkowych (.h) umieszczamy wyłącznie definicje preprocesora (#define), definicje typów, struktur, enumów itp, prototypy funkcji (nazwa i parametry bez ciała funkcji), funkcje static inline i externy zmiennych. Ogólnie mówiąc wszystko, co samo z siebie nie powoduje wygenerowania kodu ani inicjowanych danych tudzież constów.

Cała reszta może się znaleźć dopiero w plikach źródłowych (.c), włączając ciała funkcji, deklaracje stałych / tablic / zmiennych inicjowanych.

Czyli w powyższym konkretnym przypadku: tablicę musisz umieścić w pliku .c, a w pliku .h tylko deklarację dołączenia jej z zewnątrz (extern). Linker sobie z tym poradzi.

Thu, 18 Nov 2004 23:51:04 +0100, na pl.misc.elektronika, Adam Dybkowski napisał(a):

Jeśli ktoś lubi jednak dane globalne w jednym miejscu, to można je upchnąć we wspólnym nagłówku *.h. Zmienne inicjalizowane ( albo wyposażone w atrybut jak np. noinit ) deklarujemy alternatywnie : #ifdef MAINMOD char zm = 8; #else extern char zm; #endif Nagłówek dołączamy do wszystkich plików a tylko w jednym ( np. głównym ) definiujemy MAINMOD. BTW - wcześniejsze wersje AFAIR wymagały tego też dla zmiennych bss - zerowanych; teraz działa wielokrotna deklaracja nie powodując wrzawy linkera.

To tip z Avrfreaks - by Eric Weddington.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required