2012-02-25 11 views
16

¿Por qué se ha desaconsejado establecer el tipo de retorno del punto de entrada a void en C++, y luego fue eliminado por el estándar y está prohibido por los compiladores modernos? ¿Por qué se considera una mala práctica?¿Qué estuvo mal con void main()?

Ahora, según entiendo C# y Java ambos permiten tipo de retorno del punto de entrada para ser void es decir

static void main(String[] args) /* Java */ 
static void Main(string[] args) /* C# */ 

y C# y los programadores de Java no lo consideran una mala práctica, se utilizan a menudo en los hechos.

otros idiomas que sean (sólo destinen a ser, dudo C++ será sucedido en esta década, por lo menos) los posibles sucesores de C++ como el lenguaje de programación D o Vala también permiten una void main(). Como puede ver, dudo que la comunidad C++ lo haya eliminado del estándar porque era demasiado oscuro o impopular.

Así que mi pregunta es, ¿por qué la comunidad C++ eliminar void main()? ¿Qué estuvo mal con eso?

+1

Los diseñadores de diferentes idiomas toman decisiones diferentes. ¿Por qué eso importa? –

+0

@GregHewgill Entiendo eso. ¿Pero cuáles fueron los factores y las razones que hicieron que los diseñadores de C++ tomaran la decisión? – ApprenticeHacker

+1

Directamente de la boca del caballo: http: //www2.research.att.com/~bs/bs_faq2.html#void-main :) –

Respuesta

10

El comité de normas de C++ probablemente eligió int main() debido a la gran cantidad de código existente que esperaba usar una instrucción return para devolver un código de salida específico al sistema de tiempo de ejecución. No sería razonable esperar que todos los códigos existentes cambien para usar exit() en su lugar, por lo que int main() se convirtió en un requisito en el estándar.

Un lenguaje como Java, cuando se diseñó, no tenía ningún cuerpo de código existente con el que necesitara ser compatible. Por lo tanto, los diseñadores pueden elegir void main() y requieren el uso de System.exit() para códigos de salida distintos de cero.

lo tanto, lo que sería "malo" con la elección de void main() para el estándar de C++ sería que sería romper el código existente que espera utilizar return y un valor de código de salida de main().

+1

Ya veo. Así que eligieron 'int main()' para la compatibilidad con el código existente. jajaja, debería haber sabido ...: D – ApprenticeHacker

+2

No asistí a las primeras reuniones de estándares de C++, pero dudo que el comité realmente elija algo: el uso de un valor de retorno fue parte de C++ desde el principio, porque se pretendía ser esencialmente una extensión de C. C esencialmente también solía tener un retorno 'int' (aunque típicamente se declara implícitamente: se podía dejar' int' inicialmente y el compilador simplemente asumiría que esto es lo que querías decir) para tener un camino de decir automáticamente si un programa fue exitoso. Si el resultado de un programa es 'nulo', esto no da ninguna indicación de si fue exitoso. –

8

Por lo general, desea conocer el estado de salida de su programa. Esa es la razón por la que tiene el int main() - devuelve el estado de su salida.

3

Está mal porque esto no es lo que el estándar C++ especifica como legal main. A nadie le importa lo que especifiquen los otros idiomas. Para los programas C++, solo el estándar C++ es relevante, y dice int.

+2

La pregunta, en otras palabras, es ¿por qué dice eso? –

+0

@Soufiane: la pregunta es por qué no es válido. # – Puppy

+1

_Es incorrecto porque esto no es lo que el estándar de C++ especifica_ ... _solo el estándar de C++ es relevante_. jajaja, de esto me doy cuenta que 'the C++ Standard == The Newest Divine Testament' – ApprenticeHacker

10

C++ tiene nunca permitido void main(), aunque algunos compiladores pueden permitirlo como una extensión o simplemente porque no lo diagnostican.

De forma similar C nunca ha permitido void main() que no sea como una extensión; el mismo estándar de 1989 que introdujo la palabra clave void definió las dos definiciones estándar para main: int main(void) y int main(int argc, char *argv[]).

Otros idiomas lo permiten porque, bueno, son otros idiomas.

No hay una ventaja especial en poder escribir void main() en lugar de int main(). Ni siquiera necesita devolver un valor explícitamente; caerse al final de main es equivalente a return 0; (en C++, y en C comenzando con C99).

+0

+1 por los hechos. Sin embargo, aunque nunca se ha permitido, incluso el propio Bjarne Stroustrup ha escrito 'void main', es decir, en la segunda edición (y probablemente también en la primera, no lo verifiqué) de" The C++ Programming Language ". Es solo un meme, como muchas otras convenciones arbitrarias y, a menudo, poco buenas. –

+0

@ Cheersandhth.-Alf: Acabo de comprobar la segunda edición (novena impresión, creo) de TC++ PL, y no vi ninguna referencia a 'void main()' - aunque hay al menos una aparición de 'main()' con un tipo de retorno 'int' implícito (el lenguaje ya no lo permite). Revisé todas las referencias a 'main' del índice. ¿Se corrigió en la edición que tengo o me perdí algo? –

+1

Bueno, como ahora, Bjarne era un poco escéptico sobre la afirmación de que había hecho algo así, en 2006. Véase, por ejemplo, [http://groups.google.com/group/comp.lang.c++/msg/1fc435ef004677be](http://groups.google.com/group/comp.lang.c++/msg/1fc435ef004677be), donde respondí "Primer ejemplo que encontré ahora al final de la sección 7.3.2, página 233". No tengo ese libro disponible aquí y ahora, pero supongo que mi propia referencia era correcta. :-) –

Cuestiones relacionadas