Za početak, kao iskusnog programera koji ima dubinsko znanje u C programiranju, često su me pitali da li je moguće napisati program u C-u bez korištenja glavne funkcije. Odgovor je da, moguće je i objasnit ću vam kako to funkcionira. Određeni prevodioci kao što je GCC, dozvoljavaju ovo, i to je fascinantno udubljenje u fleksibilnost i mogućnosti C programiranja. Međutim, ovaj potez se smatra nestandardnim. Zašto se onda javlja ova radoznalost? To je zato što se tradicionalno kaže da izvršavanje C programa počinje od glavne funkcije. Ovo je tačno i savršeno radi za većinu standardnih slučajeva.
Funkcija _start().
Prava početna tačka u većini C programa je zapravo funkcija koja se zove _start(). Obično je ovo bootstrap funkcija koja inicijalizira potrebne resurse i konačno poziva main(). Funkciju _start() kompajler je ugradio u vaš C program, odvojeno od vašeg izvornog koda. Stoga već postoji i tajno radi svoj posao iza kulisa, a da većina programera ne mora znati za to.
Korištenje _start() umjesto main()
Konceptualna tajna pokretanja C programa bez main() leži u donošenju ovoga _start() funkcija u arenu i efikasno ga koristi umjesto main(). To je upravo trik koji nam dozvoljavaju GCC kompajleri. Evo kako:
void _start() { // Add your code here _exit(0); }
Obratite pažnju na upotrebu funkcije _exit() na kraju. Ovo je ključno jer ako program ne pozove _exit(), program će se srušiti.
Razumijevanje toka programa
Ovako će program raditi: U standardnim C programima, funkcija _start(), koju obezbjeđuje kompajler, pozivala bi funkciju main(). Međutim, u ovom slučaju, funkciju main() smo zamijenili našom vlastitom funkcijom _start() i ona se direktno izvršava umjesto poziva main(). Funkcija _exit() je sistemski poziv koji će ispravno prekinuti naš program.
Napomena o bibliotečkim zavisnostima
- Iako je zanimljivo kodirati C program bez main(), postoji nekoliko zastoja. Ova praksa uvodi priličnu količinu bibliotečke zavisnosti u vaš kod. Na primjer, za korištenje funkcije _exit() neophodna je biblioteka unistd.h.
- Ovo možda neće biti problem u početku, ali ako očekujete da će vaš kod raditi na različitim sistemima i okruženjima, preporučuje se da se držite funkcije main() jer ona donosi viši nivo prenosivosti.
U zaključku, vidjeli smo kako je moguće napraviti jedinstveni C program koji radi bez funkcije main(). Ovo je dokaz fleksibilnosti C jezika. Međutim, važno je napomenuti da je ovo nestandardna praksa, pa koristite diskreciono.