Ratkaistu: voimmeko kirjoittaa ohjelman ilman maininta kohdassa c

Viimeisin päivitys: 09/11/2023
Kirjoittaja: C SourceTrail

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.

Related viestiä: