Za početak, kao iskusnog programera koji ima dubinsko znanje o C programiranju, često su me pitali je li 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 prevoditelji poput GCC-a to dopuštaju, a to je fascinantan uvid u fleksibilnost i mogućnosti C programiranja. Međutim, ovaj se potez smatra nestandardnim. Zašto se onda javlja ova znatiželja? To je zato što se tradicionalno kaže da izvođenje C programa počinje od glavne funkcije. To je istina i radi savršeno za većinu standardnih slučajeva.
Funkcija _start().
Prava početna točka u većini C programa zapravo je funkcija koja se zove _start(). Obično je to funkcija pokretanja koja inicijalizira potrebne resurse i na kraju poziva main(). Funkciju _start() kompilator uključuje u vaš C program, odvojeno od vašeg izvornog koda. Stoga već postoji i potajno 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 učinkovito ga koristiti umjesto main(). To je upravo trik koji nam omogućuju GCC kompajleri. Evo kako:
void _start() { // Add your code here _exit(0); }
Primijetite upotrebu funkcije _exit() na kraju. Ovo je ključno jer ako program ne pozove _exit(), program će se srušiti.
Razumijevanje tijeka programa
Ovako će program raditi: U standardnim C programima, funkcija _start(), koju daje prevodilac, pozvala bi funkciju main(). Međutim, u ovom smo slučaju zamijenili funkciju main() vlastitom funkcijom _start() i ona se izravno izvršava umjesto poziva main(). Funkcija _exit() je sistemski poziv koji će ispravno prekinuti naš program.
Napomena o ovisnostima knjižnice
- Iako je zanimljivo kodirati C program bez main(), postoji nekoliko prepreka. Ova praksa uvodi priličnu količinu knjižnične ovisnosti u svoj kod. Na primjer, za korištenje funkcije _exit() potrebna je biblioteka unistd.h.
- Ovo u početku možda neće predstavljati problem, ali ako očekujete da će se vaš kod izvoditi na različitim sustavima i okruženjima, preporučuje se da se držite funkcije main() jer ona donosi višu razinu prenosivosti.
Zaključno, vidjeli smo kako je moguće izraditi jedinstveni C program koji radi bez funkcije main(). Ovo je dokaz fleksibilnosti jezika C. Međutim, važno je napomenuti da je ovo nestandardna praksa, stoga je koristite s diskrecijom.