2009-03-11 77 views

Respuesta

59

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.

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

+2

int main (void) es también adecuada – Trent

+9

En realidad, mientras que está bien, creo int main() se prefiere a int main (void) – Alan

+2

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

8

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.

+3

También se requiere la devolución de un int para C89. –

+0

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

+0

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. –

11

Debe utilizar int main. Los estándares C y C++ especifican que main debe devolver un valor.

+0

Debería devolver 0 como en el 0; – Kensai

+0

quiero preguntarle a quién le devuelve valor? – Vinay

+0

@Vinay: a cualquier persona que ejecutó su programa (generalmente el sistema operativo). – Alan

2

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.

+0

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

+0

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. –

+0

¿Por qué hay valor en hacer lo incorrecto (que funciona en algunos casos), cuando lo correcto es más trabajo? – Tom

4

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.

2

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.

3

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.

+6

'gcc -pedantic', sin embargo, lo rechazará. Y no usar '-pedantic' simplemente está mal. –

+0

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. –

+0

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