Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

funkcje deklarowane jako extern w c

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:
funkcje deklarowane jako extern w c

Postautor: Sławek5 » 4 lis 2005, o 21:11

Czesc.
Prosze Was tylko sie nie wsciekajcie moim pytaniem. Znowu sie zamieszalem i nie moge czegos zrozumiec

Jeśli mam dwa pliki glowny.c i lcd.c to piszac w glowny.c

main()
{
LcdPrint(); //na przyklad ale cala funkcja jest opisana w lcd.c
}


funkcje odnosnie lcd deklarowac w glowny.c jako extern.
Nie wiem czy extern odnosi sie przypadkiem do funkcji napisanycjh jako modulu asemblerowe.

Z gory dzieki za wyrozumialosc.
Slawek.

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 4 lis 2005, o 22:01

W większości kompilatorów funkcje deklaruje się bez słowa extern, np

void LcdPrint(void);
int func1( int x, char *pc);


takie deklarcje można wpisywać bezpośrednio w pliku, byle przed wystapieniem uzycia tych funkcji. Znacznie bardziej elegancko jest zebrac je w osobnym pliku (same deklaracje funkcji i zmiennych exportowanych z danego modułu) zwyczajowo z rozszerzeniem ".h" (od header, plik nagłówkowy) i dodawać je do pliku, w którym chcesz je użyć, dyrektywą #include

słowo "extern" konieczne jest do oznaczania ZMIENNYCH nie deklarowanych w danym module i wykazania ich typów dla kompilatora w trakcie kompilacji aktualnego modułu.

Na upartego można nie deklarować wcale funkcji a kompilator przyjmuje wtedy że funkcja zwraca wartość typu "int", a parametry wywołania odkłada wg typów domyślnych z aktualnych napisów. Oznacza to że funkcje bez parametru można zawsze bezpiecznie wywołać nawet bez ich uprzedniego deklarownia (większość kompilatorów będzie dawać ostrzeżenia) Dla funkcji z parametrami z regułu też będzie wszystko dobrze działało ale czasami można się nieprzyjemnie "naciąć". Piszę to wyłącznie dla porządku, bo osobiście absolutnie nie polecam takiego postępowania. język "C" jest bardzo mało rygorystyczny i pozwala na dużą dowolność, dlatego aby zachować czytelność i unikać "pułapek" szybkiego pisania kodu kompilatory generują całą masę ostrzeżeń. czasmi warto je poczytać.

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 4 lis 2005, o 22:18

Sławku, kup sobie "Symfonię c++" tom 1. Tam znajdziesz odp. na wszystkie zadawane dotychczas pytania!

A sprawa z extern jest prosta. Proces prowadzący do powstania pliku wynikowego (hex) skład się z 2 części:
1. kompilacja wszystkich modułów (każdego z osobna)
2. konsolidacja (linkowanie).

Kompilator kompilując dany moduł, gdy napotka wywołanie jakiejśc funkcji, musi mieć skądś informacje jakie ta funkcja ma arg. i co zwraca. Jeśli jest ona zaimplementowana w innym module, to oczywiście takiej informacji nie ma. I do "dania mu" takiej informacji służy "extern". Mówi ono "nie przjmuj się tym, że nie masz pod ręką implementacji funkcji. Ona dostaje to, to i to a zwraca to". I tyle mu wystarczy. Sprawa gdzie ona jest - to sprawa linkera.

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 5 lis 2005, o 06:43

Arku masz rację.
Spotkałem natomiast dwa rozne typy deklaracji i nie wiem z ktrego nalezy uzyc.
1. to sposob zapisu ze mam dwa pliki funkcje.c oraz main.c oraz dodatkowo funkcje.h z nagłowkami funkcji w funkcje.c
Przykladowo jezeli w funkcje.c jest

int MojaFunkcja(int a, int b)
{
return(a*b);
}


a w pliku funkcje.h

int MojaFunkcja(int a, int b);


to teraz w pliku main.c jest


#include "funkcje.h"
int x;

x=MojaFunkcja(10,5);


2. w pliku funkcje.h jest zapis
extern int MojaFunkcja(int a, int b);


i teraz czy to jest wporzadku i czy w pliku funkcja.c cala definicja funkcji musi byc tez ze slowem extern


A tak w ogole to czy konieczne jest uzycie extern czy wystarczy tak jak w pkt. 1. i w takim razie kiedy mam stosowac extern. oczywiscie zgadzam sie ze pisanie w kilku modulach jest lepsze.

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 5 lis 2005, o 10:15

i teraz czy to jest wporzadku i czy w pliku funkcja.c cala definicja funkcji musi byc tez ze slowem extern
jest w porządku. extern używasz tylko w deklaracji funkcji tam gdzie trzeba, w definicji nie należy używać żadnego extern (jaki to niby miałoby mieć sens?).
A tak w ogole to czy konieczne jest uzycie extern czy wystarczy tak jak w pkt. 1. i w takim razie kiedy mam stosowac extern. oczywiscie zgadzam sie ze pisanie w kilku modulach jest lepsze.
W zasadzie wystarczy bez "extern" - jest ono w takim przypadku przyjmowane domyślnie (jak napisał bis jest to konieczne tylko dla zmiennych). ja jednak lubię dodać extern dla elegancji i czytelności kodu :).

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 45 gości