Erezia un gol principal (), utilizați funcția principală

Dacă alocați principal () funcție de tipul de întoarcere, alta decât int, compilatorul în compilator C99 precedent, veți obține un comportament nedefinit al programului. Compilatorul C99 vei primi un comportament nespecificat dacă așa spune versiunea de implementare, sau comportament nedefinit - în cazul în care nu. Ai încredere în programul dumneavoastră în această privință?







5.1.2.2.1. Pornește programul. Caracteristică, începe programul, numit principal (primar). Implementarea nu declară nici prototip pentru această funcție. Ar trebui să fie determinată de revenirea unui int tip fără parametri:

sau cu doi parametri (aici se numesc argc și argv, deși orice nume pot fi folosite în ordinea în care acestea sunt introduse în funcția în care a anunțat):

int main (int argc, char * argv [])

sau un alt mod de punere în aplicare definit. "

5.1.2.2.3. Finalizarea programului. În cazul în care funcția principală a tipului de retur este un tip care este compatibil cu int, revenirea la funcția principală este echivalentă cu apelarea funcției de ieșire cu valoarea returnată de funcția principală ca argument; când parantezele>, care completează funcția principală returnează o valoare de 0. Dacă tipul de întoarcere nu este compatibil cu tipul int, starea de finalizare a revenit la mediul gazdă este nespecificat. "

În acest context, „nespecificată“ înseamnă că standardul nu are nevoie de nici un comportament specific de compilator, care este liber să se întoarcă la mediul gazdă (de obicei, un sistem de operare), orice stat, ceea ce îi place, și se aplică numai în cazul în care documentele de implementare găsite că susține revenirea principalelor () tipuri diferite de int. Dacă aveți un gol (void) principal Funcția principală () și scrieți codul pentru un reactor nuclear sau de un avion militar, s-ar putea simți o ușoară ezitare, și eu nu te condamn. În plus, definiția principală () pentru tipul de retur de vid (gol) nu este o eroare de sintaxă sau o încălcare a restricțiilor, astfel încât compilatorul nu trebuie să extrădeze un mesaj de diagnostic.







Să ne uităm la ea mai mult dintr-un unghi diferit. Luați în considerare al patrulea argument al qsort funcției de sortare. El a specificat un pointer la o funcție de comparație care are ca argumente două constante tip const void *, iar int tip de retur. Funcția qsort solicită funcția de comparare și de a folosi valoarea returnata pentru a determina relația dintre două obiecte din matrice, care urmează să fie sortate. Deci, ce se întâmplă atunci când scrii o funcție de comparație ca asta?

void CompInts (void const * pl, void const * p2)
const int * nl = pi;
const int * n2 = p2;
dif int;
în cazul în care (* nl> * n2)
dif = 1;
else if (* nl == * n2)
dif = 0;
altfel
dif = -1;
>

Inutil să spun, nu? În qsort funcția nu are nici o modalitate de a obține informațiile de care are nevoie. Nu puteți specifica funcțiile de comparare prototip - va trebui să se debaraseze regulile referitoare la qsort funcție, dacă doriți să faceți această funcție face ceea ce te astepti de la ea.

Bine, înapoi la funcția principală (). Există aceeași situație. Nu sunteți responsabil pentru principalele definiție de interfață (). Pentru aceasta este apelantului. Cine face apel principal ()? Nu ești tu (deși de fapt, puteți, dacă doriți să apelați principal (), la fel ca tine poate, dacă doriți să apelați funcția de comparație a qsort). Dar „client“ primar) funcție principală (este de a rula cod. Deoarece codul de pornire va determina dacă programul este de succes, dacă nu-i spui despre asta? Acest apel este „așezat“ undeva adânc în măruntaiele sistemului (aici am simplificat un pic):

returnstatus int;
returnstatus = main (argc, argv);


Dacă sunteți „devastat“ funcția principală () va fi de mai multe caracteristici interesante:

  • Programul poate lucra exact așa cum vă așteptați.
  • returnstatus poate obține prins în capcană și poate provoca un accident a programului (sau întregul calculator).
  • Codul de pornire poate trimite codul de retur fals a sistemului de operare, care apoi decide pentru a derula înapoi tranzacția bazei de date, deoarece programul nu a returnat valoarea așteptată.
  • Și acest lucru este cel mai rău dintre toate - rula cod în afara îndemâna nas și începe să extragă din ea demonii. (Demon (demon) - Procedura se execută în mod automat, în anumite condiții, și caracterizate prin comportamentul imprevizibil. - Nota ed științifică ...).

Funcția principală () returnează un int. Există doar trei valori transferabile la alte platforme, vă puteți întoarce de la main ():

Ultimele două sunt definite în , și valorile reale ale acestora variază în funcție de sistemul particular. (Cu alte cuvinte, nu caută aceste valori în bibliotecă și a le transfera la programul tau.)

Dacă ați revenit la 0, codul de pornire va spune sistemul de operare sau alte medii gazdă, că programul este de succes, traducerea 0, dacă este necesar, la o valoare diferită.

Numărul de argumente ale principalelor funcții ()

De fapt, funcția poate fi determinată prin determinarea punerii în aplicare. Prin urmare, o astfel de determinare principală, ambele

int main (int argc)