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.
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
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
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ć.
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ć.
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
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.
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.
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.
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.
-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
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?).i teraz czy to jest wporzadku i czy w pliku funkcja.c cala definicja funkcji musi byc tez ze slowem extern
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 .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.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 17 gości