¿Importa la forma en que declaro mis programas en C++?¿Diferencia entre void main e int main?
Respuesta
La diferencia es una forma correcta de definir main
, y la otra no.
Y sí, importa.
int main(int argc, char** argv)
o
int main()
es la definición correcta de su especificación main
por el C++.
void main(int argc, char** argv)
no estaba y sigue estando, IIRC, una perversidad que viene con el compilador C++ de Microsoft.
Para C++, sólo se permite int. Para C, C99 dice que solo int está permitido. El estándar anterior permitía un retorno nulo.
En resumen, siempre int.
También se requiere la devolución de un int para C89. –
En realidad, C89 es vago dependiendo de cómo lo lea. Interesante lectura aquí: http://homepages.tesco.net/J.deBoynePollard/FGA/legality-of-void-main.html – Joe
que enlazan a pesar de que, int es el tipo de devolución requerido en C89 y C99 si quiere su programas para ser portátil. –
Si va por la especificación, siempre debe declarar main como un int.
En realidad, sin embargo, la mayoría de los compiladores le permitirán salirse con una de las dos, por lo que la verdadera diferencia es si desea/necesita devolver un valor al shell.
Siempre debe intentar hacer las cosas "por especificación" a menos que haya una razón de peso para no hacerlo. De acuerdo, muchas implementaciones permiten void main y otras extensiones. Esto no significa que deba confiar en extensiones específicas de la implementación. En aplicaciones integradas, sin shell, el vacío principal está bien. – Trent
Voy a seguir adelante y estoy de acuerdo con todo eso. Por un tiempo, adquirí el hábito de usar void vs int como una especie de pesudo comentario sobre si esperaba devolver un valor, pero ahora siempre uso int. –
¿Por qué hay valor en hacer lo incorrecto (que funciona en algunos casos), cuando lo correcto es más trabajo? – Tom
El punto es que los programas C (y C++ son los mismos) siempre (¿deberían?) Devolver un valor correcto o un código de error, por lo que deberían declararse de esa manera.
Hace mucho tiempo encontré this page (void main(void)) que contenía muchas razones fuera del argumento "el estándar dice que no es válido". En arquitecturas/sistemas operativos particulares, podría hacer que la pila se corrompiera y otras cosas desagradables sucedan.
En C++, main()
debe devolver int
. Sin embargo, C99 permite que main()
tenga un tipo de devolución que no sea int
. Aquí está el extracto del estándar C99.
5.1.2.2.1 inicio del programa
La función llamada al inicio del programa se denomina principal. La implementación no declara el prototipo para esta función.Que se define con un tipo de retorno de int y sin parámetros:
int main(void) { /* ... */ }
o con dos parámetros (denominados aquí como argc y argv, aunque los nombres pueden usan, puesto que son locales de la función en la que se declaran):
int main(int argc, char *argv[]) { /* ... */ }
o equivalente; o de alguna otra manera definida por la implementación.
También tenga en cuenta que gcc compila void main()
aunque, en la práctica, hace un return 0;
al encontrar una llave de cierre.
'gcc -pedantic', sin embargo, lo rechazará. Y no usar '-pedantic' simplemente está mal. –
Estoy de acuerdo, pero utilicé gcc solo como ejemplo porque quizás sea el compilador más popular. El estándar claramente permite un tipo de retorno no interno para main() en C99, según el texto que resalté en negrita. –
Si confía en el comportamiento definido por la implementación, entonces su programa no se ajusta a las normas. Su compilador puede aceptarlo, pero no es válido C99, solo foo-C99. – Jed
Bjarne Stroustrups hizo esto muy claro:
"La definición void main()
no es y nunca ha sido es C++, ni siquiera ha sido C."
- 1. Usando `void main` en D
- 2. Java - public static void main()
- 3. ¿Por qué main() en java void?
- 4. "int main (vooid)"? ¿Cómo funciona?
- 5. ¿Qué estuvo mal con void main()?
- 6. ¿Por qué int main() {} compila?
- 7. ¿Hay una diferencia entre main (String args []) y main (String [] args)?
- 8. C++ - int main (int argc, char ** argv)
- 9. Usando Environment.ExitCode versus return int desde Main
- 10. En maven, ¿cuál es la diferencia entre main/resources y main/config?
- 11. ¿el estándar C++ prohíbe el prototipo void main()?
- 12. Principiante: error de sintaxis antes int main()
- 13. ¿Cuál es la diferencia entre wmain y main?
- 14. ¿Está bien formada la int main (int, char const * const *)?
- 15. ¿Cuál es la diferencia entre double a = a + int b e int a + = double b?
- 16. ¿Qué sucede si main() no devuelve un valor int?
- 17. ¿Diferencia entre long e int en C#?
- 18. Definición de main() en C
- 19. punteros void: diferencia entre C y C++
- 20. Parámetros para main con requireJS y data-main
- 21. Diferencia entre int e INT recibida por Parseint en Java
- 22. Diferencia entre int * p e int * p declaración
- 23. ¿Cuál es la diferencia entre int [] [] e int [,]?
- 24. return string variable from Main()
- 25. Sin Main() en WPF?
- 26. Clojure -main en IntelliJ
- 27. main() función en JavaScript?
- 28. Múltiples métodos main() en java
- 29. ¿Es necesario devolver un valor en Main()?
- 30. C++ tipo de retorno nulo de main()
int main (void) es también adecuada – Trent
En realidad, mientras que está bien, creo int main() se prefiere a int main (void) – Alan
Ellos son el * requisito mínimo * para los argumentos (y es "char * argv []", no "char ** argv"). Las implementaciones están permitidas explícitamente para proporcionar más formularios. El tipo de devolución int, sin embargo, no es negociable como usted indica. – paxdiablo