Otvaram ovaj thread jer mi se čini da bi bilo dobro da imamo sva pitanja koja nisu vezana za neki konkretan zadatak na jednom mestu.
Ako se sećate, u početku sam imao problem što kod nije mogao da se prevodi u Visual Studio-u, dok je sasvim dobro radio sa gcc. To je u međuvremenu razrešeno, ali sada mi uopšte nije jasno kako se kod za triangulator bilo gde prevodi.
Koliko mi je poznato, prevođenje se vrši iz tri faze: pretprocesor vrši leksičku obradu, zatim se izdvajaju tokeni iz sirovog teksta, koje builder koristi da bi kreirao .obj fajlove. Na kraju, linker prolazi kroz .obj fajlove i povezuje deklaracije sa definicjama, ukoliko se nisu nalazile u istom fajlu.
Stil programiranja sa kojim sam se do sad susreo je nalagao da u .hpp fajl u kome koristim neko ime uključim .hpp fajl sa odgovarajućom deklaracijom. Tako bih, recimo, morao da uključim colors.hpp direktno u classes.hpp, jer je jedno od polja KSimplex-a lista boja koje ga opisuju. Kada uključim colors.hpp na početku fajla, builder zna deklaraciju klase Color i nema problema.
Međutim, mi to ne radimo, već sve deklaracije uključujemo u triangulator.hpp, i zatim to dalje u main.cpp. Nije mi jasno kako builder "zna" deklaraciju klase Color unutar fajla classes.hpp.
U knjizi (Milićev, 1995, str. 71) sam našao:
Zbog potpuno nezavisnog prevođenja jednog fajla (prevodilac "ne vidi" ništa drugo osim onoga što se nalazi u fajlu koji trenutno prevodi), svaki programski fajl treba da sadrži sve što je potrebno za uspešno prevođenje tog fajla. To znači da je potrebno da u svakom fajlu postoje odgovarajuće deklaracije svih imena koja se u fajlu koriste. Svako korišćenje imena bez prethodne deklaracije u fajlu prevodilac prijavljuje kao grešku. /.../ Deklaracije imena navode se u svim fajlovima u kojima se ta imena koriste.
Prema gornjem teksu, očekivao bih da prevodilac baci grešku jer mu ime klase Color nije definisano. Ipak, nešto ranije na istoj strani, prof. Milićev je napisao i:
Prevodilac prevodi svaki programski fajl (skoro) potpuno nezavisno, ne znajući koji sve fajlovi čine program.
Pretpostavio sam da rešenje moje nejasnoće leži u ovome (skoro), ali nisam uspeo na internetu da nađem nikakve detalje koji bi mi razjasnili kako radi prevodilac u VS.
Da li bi neko mogao da mi objasni zašto naš kod radi?
Pozdravi,
Dušan
(1) Milićev, D, Objektno orijentisano programiranje na jeziku C++, Beograd, 1995.