2009-03-11 36 views

risposta

59

La differenza è uno è il modo corretto di definire main e l'altro no.

E sì, importa.

int main(int argc, char** argv) 

o

int main() 

è la corretta definizione del vostro main per il C++ spec.

void main(int argc, char** argv)

non è ed è stato, IIRC, una perversione che è venuto con il compilatore C++ di Microsoft.

https://isocpp.org/wiki/faq/newbie#main-returns-int

+2

int main (void) è anche corretto – Trent

+9

In realtà, mentre che va bene, penso che int main() è preferito a int main (void) – Alan

+2

Sono i * minimo * requisito per argomenti (e è "char * argv []", non "char ** argv"). Le implementazioni sono esplicitamente autorizzate a fornire più moduli. Il tipo di ritorno int, tuttavia, non è negoziabile come si afferma. – paxdiablo

8

Per C++, solo int è consentito. Per C, C99 dice che solo int è permesso. Lo standard precedente consentito per un reso vuoto.

In breve, sempre int.

+3

Il ritorno di un int è richiesto anche per C89. –

+0

In realtà, C89 è vago a seconda di come lo leggi. Interessante lettura qui: http://homepages.tesco.net/J.deBoynePollard/FGA/legality-of-void-main.html – Joe

+0

che link non-resistere, int è il tipo di ritorno richiesto in C89 e C99 se vuoi il tuo programmi per essere portatili. –

11

È necessario utilizzare int main. Entrambi gli standard C e C++ specificano che main dovrebbe restituire un valore.

+0

Dovrebbe restituire 0 come ritorno 0; – Kensai

+0

voglio chiedere a chi restituisce valore? – Vinay

+0

@Vinay: a qualsiasi cosa venga eseguita il programma (in genere il sistema operativo). – Alan

2

Se si specifica la specifica, è necessario dichiarare main come int.

In realtà, però, la maggior parte dei compilatori ti consente di ottenere via con uno dei due, in modo che la vera differenza è se si vuole/bisogno di restituire un valore alla shell.

+0

Dovresti sempre provare a fare le cose "secondo le specifiche" a meno che non ci sia un valido motivo per non farlo. Certo, molte implementazioni consentono il main vuoto e altre estensioni. Ciò non significa che dovresti fare affidamento su estensioni specifiche dell'implementazione. Nelle applicazioni incorporate, senza shell, void main è ok. – Trent

+0

Ho intenzione di andare avanti e sono d'accordo con tutto ciò. Per un po ', ho preso l'abitudine di usare void vs int come una sorta di pesudo-commento sul fatto che mi aspettassi di restituire un valore, ma ora uso sempre int. –

+0

Perché c'è un valore nel fare la cosa sbagliata (cosa che succede in alcuni casi), quando la cosa giusta è più lavoro? – Tom

4

Il punto è, i programmi C (e C++ lo stesso) sempre (dovrebbe?) Restituiscono un valore di successo o un codice di errore, quindi dovrebbero essere dichiarati in questo modo.

2

Molto tempo fa ho trovato this page (void main(void)) che conteneva molte ragioni al di fuori dell'argomento "la norma dice che non è valido". Su particolari sistemi operativi/architetture potrebbe causare il danneggiamento dello stack e/o altre cose brutte.

3

In C++, main() deve tornare int. Tuttavia, C99 consente a main() di avere un tipo di reso non- int. Ecco l'estratto dallo standard C99.

5.1.2.2.1 all'avvio del programma

La funzione chiamata all'avvio del programma prende il nome principale. L'implementazione non dichiara il prototipo per questa funzione.Essa è definita con un tipo di ritorno di int e senza parametri:

int main(void) { /* ... */ }

o con due parametri (qui indicati come argc e argv, se tutti i nomi possono essere , poiché essi sono locali alla funzione in cui sono dichiarate):

int main(int argc, char *argv[]) { /* ... */ }

o equivalente; o in qualche altro modo definito dall'implementazione.

Si noti inoltre che gcc compila void main() anche se praticamente fa un return 0; incontrando una parentesi di chiusura.

+6

'gcc -pedantic', tuttavia, lo rifiuterà. E non usare '-pedantic' è solo incasinato. –

+0

D'accordo, ma ho usato gcc solo come esempio perché è forse il compilatore più popolare. Lo standard consente chiaramente un tipo di ritorno non int per main() in C99, come da testo evidenziato in grassetto. –

+0

Se si basa sul comportamento definito dall'implementazione, il programma non è conforme agli standard. Il tuo compilatore può accettarlo, ma non è valido C99, solo foo-C99. – Jed