roske napisał(a):
Oczywiście, że się "rozprzestrzeni", ale kompilator zgłosi błąd ponieważ nie będzie znał typu zmiennej.
No w tym momencie sam sobie zaprzeczasz i twierdzisz, że jest OK ? Skoro zgłosi błąd to chyba nie będzie za dobrze hmmm ?
roske napisał(a):
Proponuję Ci jednak skompilować i uruchomić choćby tylko mój pierwszy programik main.c/foo.c/foo.h,
Nie zdziwię się, bo ja kompilowałem a ty kompletnie nie odniosłeś się do tego co pisałem i prosiłem żebyś sprawdził ...
kisiel napisał(a):
Kto nie rozumie co to jest deklaracja?
No ty nie rozumiesz, tak mi się wydaje.
kisiel napisał(a):
Po pierwsze, deklaracja jest w momencie kiedy zmienna posiada typ oraz nazwę i NIE WAŻNE gdzie wpiszemy tą deklaracje, czy w pliku *.h czy w pliku *.c - to nadal jest DEKLARACJA. Definicja zmiennej następuje, kiedy do zmiennej przypisujemy jakąś wartość.
Przepraszam cię najmocniej ale nawet pomimo tego co napisałeś niżej:
kisiel napisał(a):
Chciałbym też nadmienić że nie jestem jakiś tam pierwszy lepszy szaraczek, tylko programowaniem w C zajmuje się zawodowo już od paru lat
Co widać zresztą po wypowiedziach, jakbyś połknął wszystkie rozumy świata - to ja ci tylko podpowiem, że ja jestem początkujący w języku C - to tak żebyśmy się rozumieli ok? Ja pisząc, dyskutując też się uczę .... ale jeszcze raz powtórzę - to co napisałeś
kisiel napisał(a):
Po pierwsze, deklaracja jest w momencie kiedy zmienna posiada typ oraz nazwę i NIE WAŻNE gdzie wpiszemy tą deklaracje, czy w pliku *.h czy w pliku *.c - to nadal jest DEKLARACJA. Definicja zmiennej następuje, kiedy do zmiennej przypisujemy jakąś wartość.
to jest wierutna BZDURA niestety. Ba, to co napisałeś pokazuje nawet, że ty chyba nie wiesz (tak się domyślam tylko), że np zmienne globalne są automatycznie inicjalizowane wartością = 0, więc gdybyś o tym wiedział to nie pisałbyś bzdur, że z definicją mamy do czynienia tylko wtedy gdy przypisujemy do niej jakąś wartość .... BZDURA NAD BZDURY!
przepraszam walnąłem się bo miałeś plik *.C już mi się miesza w oczach zaraz odpiszę na dalszą część inaczej
------------------------ [ Dodano po: 23 minutach ]jeśli mam plik main.c
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to szanowny kolego pokazałem ci co to jest DEFINICJA zmiennej. Definicja oznacza, że kompilator zarezerwuje dla tej zmiennej od razu DWA bajty ponieważ mamy typ int (a ja podaję przykłady dla AVR GCC) .... I tym się charakteryzuje DEFINICJA zmiennej, nie ważne czy na procka czy na PC. Po kompilacji zobaczysz zajętość pamięci RAM = 2 bajty.
Cytuj:
Device: atmega32
Program: 132 bytes (0.4% Full)
(.text + .data + .bootloader)
Data: 2 bytes (0.1% Full)
(.data + .bss + .noinit)
A teraz uważaj panie kolego, zrób taki test:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
no i teraz zobacz na zajętość pamięci RAM:
Cytuj:
Device: atmega32
Program: 116 bytes (0.4% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
widzisz sekcję DATA? = 0 bytes
I ja dobrze rozumiem skąd programiści C nawet jak piszesz programujący od kilku lat na PC mają problem ze zrozumieniem tych zagadnień, a to dlatego, że nigdy nie patrzą na to pod kątem zajętości pamięci - co się dzieje po kompilacji - to zwykle na PC jest mało ważne - a wtedy pojawiają się takie dziwne pomysły jak twoje.
Podsumowując jeśli dołączysz do projektu plik foo.h w którym napiszesz
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
bez specyfikatora extern, to zrozum, że to będzie DEFINICJA zmiennej abc i to w KAŻDYM pliku źródłowym do którego zainkludujesz taki plik *.h. A to, że będziesz widział zawartość zmiennej abc z pliku main.c - to co opowiada z kolei roske - to dlatego, że linker przyjmie adres zmiennej w pamięci RAM zdefiniowanej w pliku main.c i nie ma w tym nic dziwnego dokąd nie stworzysz dotatkowych plików i wtedy kompilator zacznie się drzeć, że błąd ponieważ widzi
multiple definition of abc;
-------------------------------------------------------------
a więc tak, twój przykładowy program main.c zostanie w procesie prekompilacji za pomocą PREPROCESORA rozwinięty do takiej postaci (teraz uważaj dokładnie)
kisiel napisał(a):
Dla potwierdzenia moich słów przeprowadziłem drugi test:
to raczej dla potwierdzenia że niestety kompletnie nie rozumiesz o co chodzi, już wyjaśniam - to co zrobiłeś

ten program który napisałeś rzekomo dla potwierdzenia - po wstępnej fazie kompilacji przez PREPROCESOR o czym też zdajesz się nie wiedzieć będzie wyglądał TAK (zdziwisz się pewnie teraz)
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
czyli krótko do:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i dzięki temu, że robisz bzdurę i w pliku *.h robisz DEFINICJĘ zmiennej - to DLATEGO w tak prostym projekcie zadziałało to u ciebie
a teraz jak mówię dodaj trzeci plik *.c i zainkluduj swój plik *.h - OOOOOJ BĘDZIESZ ZDZIWIONY - bo się nie skompiluje a ty zobaczysz błąd
multiple definitions