Ależ nic się nie wyklucza
Ja bym nawet tylko nieco uściślił swoją wypowiedź z książki, o tak:
Cytuj:
Poprzedzenie zmiennej słowem extern informuje kompilator, że zmienna ta jest już zdefiniowana w innym module programu
Ja powiedziałbym, że ta
definicja, którą przytoczył kolega jest wręcz mniej precyzyjna
Cytuj:
Oznacza, że deklaracja nie jest deklaracją w sensie fizycznym, a jedynie odwołaniem do deklaracji znajdującej się w innej jednostce kompilacji (module, pliku, bibliotece - przyp. autora). Jednym słowem, jest to sposób na poinformowanie kompilatora, by nie szukał danej zmiennej globalnej w aktualnym pliku
deklaracja nie jest deklaracją ? ... a co to ? ......
DEKLARACJA zmiennej z przydomkiem extern (bo tylko wtedy jest do deklaracja gdy przy zmiennej jest extern) nie jest DEFINICJĄ (i jak się tak napisze to nawet nie trzeba dodawać że "w sensie fizycznym") .... Bo jak ktoś zna różnicę pomiędzy DEKLARACJĄ a DEFINICJĄ (co wałkuję wciąż w książce) to chyba jest to zrozumiałe. Ale przypomnę:
DEKLARACJA - nie rezerwuje miejsca w pamięci na zmienną lub funkcjęDEFINICJA - rezerwuje miejsce w pamięci na zmienną lub funkcję.No i to ostatnie zdanie:
Cytuj:
Jednym słowem, jest to sposób na poinformowanie kompilatora, by nie szukał danej zmiennej globalnej w aktualnym pliku
jest hmm lekkim nieporozumieniem wręcz. Bo pomyśl sobie, masz np plik
lcd.h w którym masz
Kod:
extern int zmienna; // DEKLARACJA zmiennej
za to w pliku
lcd.c , w którym na początku inkludujemy lcd.h mamy właściwą DEFINICJĘ tejże zmiennej, czyli:
Kod:
int zmienna; // DEFINICJA ZMIENNEJ
to pytam - jak to się ma do tego zdania ?
.... przecież "zmienna" jest w ramach tego pliku jednocześnie zmienną globalną - widoczną w całym pliku nawet gdyby nie było deklaracji w lcd.h - zgadzasz się z tym?
a zatem co ? gdy dodamy lcd.h - to nagle kompilator co ? nie będzie szukał zmiennej globalnej w aktualnym pliku ???? sam chyba teraz widzisz to nieporozumienie
zresztą kompilator nic nie szuka, ktoś być może nie zdaje sobie sprawy z etapów kompilacji programów w języku C....
każdy plik *.C jest kompilowany oddzielnie, i teraz jeśli np mam plik main.c , w którym mam zainkludowany nasz lcd.h z tą DEKLARACJĄ zmiennej jak wyżej - to po PIERWSZYM etapie kompilacji w pliku przejściowym jest tylko informacja, że gdzieś w innej części programu (w innym pliku *.c nie ważne na tym etapie, wystąpi zmienna i będzie określony jej adres) ... i rzeczywiście w trakcie ostatniego procesu kompilacji jakim jest LINKOWANIE - dopiero zostają podstawiane fizyczne adresy - gdy wszystkie kawałki kodu zostają LOKOWANE w poszczególnych miejscach pamięci a jednocześnie gdy w pamięci RAM przydzielane są adresy zmiennych.
Więc ja określiłbym przytoczoną przez ciebie definicję jako delikatnie nieprecyzyjną - ale na pewno nie wykluczającą z tym co napisałem w książce. I co więcej - nie ma to nic wspólnego z AVR , STM czy jakimkolwiek innym procesorem. Tu jest mowa o języku C całkowicie w oderwaniu jak widzisz od platformy.
teraz jaśniej ?