Aluksi, kokeneena kehittäjänä, jolla on syvällinen C-ohjelmoinnin tuntemus, minulta on usein kysytty, onko mahdollista kirjoittaa C-kielellä ohjelma ilman päätoimintoa. Vastaus on, kyllä, se on mahdollista, ja aion selittää, kuinka tämä toimii. Tietyt kääntäjät, kuten GCC, sallivat tämän, ja se on kiehtovaa syventyä C-ohjelmoinnin joustavuuteen ja mahdollisuuksiin. Tätä liikettä pidetään kuitenkin epätyypillisenä. Joten miksi tämä uteliaisuus herää? Se johtuu siitä, että perinteisesti sanotaan, että C-ohjelman suoritus alkaa pääfunktiosta. Tämä on totta ja toimii täydellisesti useimmissa vakiotapauksissa.
_start()-funktio
Todellinen aloituspiste useimmissa C-ohjelmissa on itse asiassa funktio nimeltä _start(). Yleensä tämä on bootstrap-funktio, joka alustaa tarvittavat resurssit ja lopulta kutsuu main(). Kääntäjä sisällyttää _start()-funktion C-ohjelmaasi erillään lähdekoodistasi. Siksi se on jo olemassa ja tekee salaa työtään kulissien takana ilman, että useimpien kehittäjien tarvitsee tietää siitä.
Komenton _start() käyttäminen main()
Käsitteellinen salaisuus C-ohjelman suorittamisesta ilman main():ta on tämän tuomisessa _start()-funktion areenalle ja käyttää sitä tehokkaasti main() -kohdan sijasta. Tämä on juuri se temppu, jonka GCC-kääntäjät antavat meille mahdollisuuden tehdä. Näin:
void _start() {
// Add your code here
_exit(0);
}
Huomaa _exit()-funktion käyttö lopussa. Tämä on tärkeää, koska jos ohjelma ei kutsu _exit(), ohjelma kaatuu.
Ohjelmakulun ymmärtäminen
Ohjelma toimii näin: Tavallisissa C-ohjelmissa kääntäjän tarjoama _start()-funktio kutsuisi main()-funktiota. Tässä tapauksessa olemme kuitenkin korvanneet main()-funktion omalla _start()-funktiollamme, ja se suoritetaan suoraan main()-kutsun sijaan. Funktio _exit() on järjestelmäkutsu, joka päättää ohjelmamme oikein.
Huomautus kirjastojen riippuvuuksista
- Vaikka on mielenkiintoista koodata C-ohjelma ilman main(a), siinä on muutamia takaiskuja. Tämä käytäntö tuo melkoisen määrän kirjastojen riippuvuudet koodiisi. Esimerkiksi _exit()-funktion käyttämiseen tarvitaan unistd.h-kirjasto.
- Tämä ei ehkä ole ongelma aluksi, mutta jos odotat koodisi toimivan eri järjestelmissä ja ympäristöissä, on suositeltavaa käyttää main()-funktiota, koska se parantaa siirrettävyyttä.
Lopuksi, olemme nähneet, kuinka on mahdollista luoda ainutlaatuinen C-ohjelma, joka toimii ilman main()-funktiota. Tämä on osoitus C-kielen joustavuudesta. On kuitenkin tärkeää huomata, että tämä on epätyypillinen käytäntö, joten käytä sitä harkiten.