Ha importanza in che modo dichiaro i miei programmi C++?Differenza tra void main e int main?
risposta
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.
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.
Il ritorno di un int è richiesto anche per C89. –
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
che link non-resistere, int è il tipo di ritorno richiesto in C89 e C99 se vuoi il tuo programmi per essere portatili. –
È necessario utilizzare int main. Entrambi gli standard C e C++ specificano che main dovrebbe restituire un valore.
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.
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
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. –
Perché c'è un valore nel fare la cosa sbagliata (cosa che succede in alcuni casi), quando la cosa giusta è più lavoro? – Tom
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.
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.
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.
'gcc -pedantic', tuttavia, lo rifiuterà. E non usare '-pedantic' è solo incasinato. –
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. –
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
Bjarne Stroustrups fatto questo abbastanza chiaro:
"La definizione void main()
non è e non è stato è C++, e neppure ha avuto C."
- 1. Differenza tra int main() e int main (void)?
- 2. Differenza tra main (void) e main() in C
- 3. differenza tra void (int) e void (*) (int)
- 4. Java - public static void main()
- 5. Utilizzo di `void main` in D
- 6. C++ void return type of main()
- 7. Differenza tra Environment.Exit e semplice ritorno 2 da Main
- 8. 'main (int argc, char * argv [])'
- 9. In maven, qual è la differenza tra main/resources e main/config?
- 10. Cosa significa "public static void main args"?
- 11. Differenza tra main.php e main-local.php nella cartella config?
- 12. Differenza tra decltype (..., void()) e void_t
- 13. Parametri a main con requireJS e data-main
- 14. main nel namespace
- 15. Equivalente di Python di "public static void main"
- 16. dove dichiarare le strutture, dentro main() o outside main()?
- 17. Process argc e argv outside main()
- 18. Groovy - metodo Main posizionamento
- 19. Qual è la differenza tra (void *) e (void (*) (tipo di argomento)) cast?
- 20. `riferimento non definito a` main` nella classe Cpp senza main()
- 21. Eccezione nella discussione "main" java.util.NoSuchElementException
- 22. funzione di callback: differenza tra void (* func) (int) e vuoto (func) (int)
- 23. Cosa succede veramente quando compilo int main; in C
- 24. Qual è la differenza tra void * e void **?
- 25. L'int main (int, char const * const *) è ben formato?
- 26. Differenza tra int * i e int ** i
- 27. Dov'è main() in Android?
- 28. exiting functions in main
- 29. Cosa significa exit (main())
- 30. Perché usare def main()?
int main (void) è anche corretto – Trent
In realtà, mentre che va bene, penso che int main() è preferito a int main (void) – Alan
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