2013-03-09 14 views
5

Ciò che realmente accadere quando compilo:Cosa succede veramente quando compilo int main; in C

int main; 

Non è forse dovrebbe essere main() e ha causato un errore?

Ho provato a compilare il codice in CodeBlocks e ha compilato perfettamente senza errori.

+5

non lo fa semplicemente dichiarare un intero chiamato 'main'? – Rob

+0

@Rob Tuttavia, quando ho provato a eseguire "int x;" CodeBlocks mi dà questo errore: riferimento indefinito a 'WinMain @ 16 ' –

+1

Puoi sicuramente avere il tuo programma in esecuzione con esso, anche se alcuni compilatori lanciano un avvertimento se dichiari una variabile chiamata 'main':' warning: 'main' è di solito una funzione' – Rob

risposta

6

Non è un errore in quanto un file sorgente C non ha bisogno di avere una funzione main ed è possibile definire main come si desidera purché non si tenti di definirlo due volte nello stesso ambito. Poiché questo è l'intero programma, va bene, ma il programma sicuramente non funzionerà correttamente poiché non è disponibile la funzione main.

Tutto ciò che fa è dichiarare una variabile globale (esterna) chiamata main, inizializzata a 0. Il linker normalmente emetterebbe un errore se non è lì, ma potrebbe essere soddisfatto della presenza della variabile esterna (mi aspetto che stia assumendo è un puntatore).

MODIFICA: Ho esaminato un po 'questo aspetto con il debugger, e sicuramente, main ha un valore di 0, cioè la variabile viene utilizzata come puntatore senza cast. Quindi il codice di inizializzazione tenta di eseguire una funzione localizzata all'indirizzo 0, risultante in un segfault sulla mia piattaforma.

3

Penso che qui ci si stia confondendo a causa dell'errata (o mancanza di comprensione) dello scope.

Quando si dice che una dichiarazione di int main; viene passata dal compilatore, suppongo che si stia dichiarando nell'ambito di una funzione. Ma, se provi a dichiararlo in ambito globale, il compilatore genererà un errore di ridefinizione.

Quindi, fintanto che non si hanno due identificatori identici nello stesso ambito, il compilatore sarà soddisfatto e ti permetterà di avere la tua strada.

Il seguente codice determina un errore redeinition:

int main; 

int main() 
{ 
    printf("In main\n"); 
} 

Il codice qui sotto non perché la portata principale è limitato solo all'interno della funzione e compilatore considera la variabile int main e il risultato viene stampato come 5.

int main() 
{ 
    int main = 5; 
    printf("In main, value of main is %d\n", main); 
} 

il codice qui sotto invece stamperà l'indirizzo del principale

int main() 
{ 
     printf("In main, value of main is %d\n", main); 
} 

EDIT: Dopo aver letto i vari commenti, mi sento il problema chiave qui è che non stanno avendo una funzione principale a tutti, che si dovrebbe avere per un programma "C" per iniziare a lavorare. Se non hai una funzione principale, ma dichiari semplicemente una variabile int main;, il tuo codice potrebbe ancora essere compilato, ma quando eseguirai ci sarà confusione e caos dato che main è una variabile intera, mentre dovrebbe essere una funzione. Ma, a patto che tu tenga sotto controllo il/i tuo/i principale/i come da mia risposta sopra, dovresti fare bene.

Si può andare this link, che spiega il concetto di compilazione e l'esecuzione di un programma C

+1

Dai commenti, questo è l'intero programma, cioè non esiste una funzione principale. – teppic

+0

@teppic, :). Avrei dovuto leggere la domanda con più attenzione. – Jay

Problemi correlati