Tipo de retorno de la función principal

Posible duplicado:
¿Qué debería devolver main () en C / C ++?
¿Diferencia entre vacío principal y principal int?

Siempre he estado usando el método principal en C como

void main(){ // my code } 

y funciona bastante bien para mí. También sé sobre el otro tipo de retorno int :

 int main(void) int main() int main(int argc, char *argv[]) 

Pero no he podido encontrar ningún recurso que diga que puedo usar void como tipo de retorno. Cada libro sugiere que el tipo de devolución debe ser int o, de lo contrario, debe omitirse. Entonces, ¿por qué funciona void main() ?

¿Depende esto de la versión de C que estoy usando? ¿O funciona porque uso un IDE de C ++? Por favor responda específicamente a C y no a C ++.

Solo los autores de libros parecen estar al tanto del lugar donde se permite un tipo de devolución de void para main() . El estándar C ++ lo prohíbe completamente.

La norma C dice que las formas estándar son:

 int main(void) { ... } 

y

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

permitiendo formas de statement alternativas pero equivalentes para los tipos de argumentos (y los nombres son completamente discrecionales, por supuesto, ya que son variables locales de la función).

El estándar C hace pequeñas provisiones para ‘en alguna otra forma definida de implementación’. La norma ISO / IEC 9899: 2011 dice:

5.1.2.2.3 Terminación del progtwig

Si el tipo de retorno de la función main es un tipo compatible con int , un retorno de la llamada inicial a la función main es equivalente a llamar a la función de exit con el valor devuelto por la función main como su argumento; 11) alcanzar el } que termina la función principal devuelve un valor de 0. Si el tipo de retorno no es compatible con int , el estado de terminación devuelto al entorno de host no está especificado.

11) De acuerdo con 6.2.4, la vida útil de los objetos con la duración del almacenamiento automático declarada en main habrá finalizado en el primer caso, incluso cuando no lo hubiera en el segundo.

Esto permite claramente las devoluciones no int , pero deja claro que no está especificado. Por lo tanto, void podría ser permitido como el tipo de retorno de main() por alguna implementación, pero solo puede encontrarlo en la documentación.

(Aunque estoy citando el estándar C2011, esencialmente las mismas palabras estaban en C99, y creo que C89 aunque mi texto para eso está en la oficina y no lo estoy).

Por cierto, el apéndice J de la norma menciona:

J.5 Extensiones comunes

Las siguientes extensiones se usan ampliamente en muchos sistemas, pero no son portátiles para todas las implementaciones. La inclusión de cualquier extensión que pueda hacer que un progtwig estrictamente conforme se convierta en inválido hace que una implementación no sea conforme. Ejemplos de dichas extensiones son las nuevas palabras clave, funciones de biblioteca adicionales declaradas en encabezados estándar o macros predefinidas con nombres que no comienzan con un guión bajo.

J.5.1 Argumentos del entorno

En un entorno alojado, la función main recibe un tercer argumento, char *envp[] , que apunta a una matriz terminada en nulo de punteros a char , cada uno de los cuales apunta a una cadena que proporciona información sobre el entorno para esta ejecución del progtwig (5.1.2.2.1).

¿Por qué funciona void main() ?

La pregunta observa que el void main() funciona. ‘Funciona’ porque el comstackdor hace todo lo posible para generar código para los progtwigs. Los comstackdores como GCC avisarán sobre formularios no estándar para main() , pero los procesarán. El enlazador no está demasiado preocupado por el tipo de retorno; simplemente necesita un símbolo main (o posiblemente _main , dependiendo del sistema) y cuando lo encuentra, lo vincula con el ejecutable. El código de inicio asume que main se ha definido de manera estándar. Si main() vuelve al código de inicio, recostack el valor devuelto como si la función devolviera un int , pero es probable que ese valor sea basura. Por lo tanto, parece que funciona, siempre y cuando no busque el estado de salida de su progtwig.

De la boca del caballo :

5.1.2.2.1 Inicio del progtwig

1 La función llamada al inicio del progtwig se llama main . La implementación no declara ningún prototipo para esta función. Se definirá con un tipo de retorno de int y sin parámetros:

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

o con dos parámetros (referidos aquí como argc y argv , aunque se puede usar cualquier nombre, ya que son locales a la función en la que están declarados):

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

o equivalente; 9) o de alguna otra forma definida por la implementación.


9) Por lo tanto, int se puede reemplazar por un nombre typedef definido como int, o el tipo de argv se puede escribir como char ** argv, y así sucesivamente.

La laguna es la “otra forma definida por la implementación”. Una implementación puede permitir que main devuelva void (o cualquier otro tipo), pero debe documentar explícitamente que dicha firma está permitida. De lo contrario, el comportamiento no está definido, lo que significa que el comstackdor puede hacer lo que quiera. El progtwig puede ejecutarse sin ningún problema. Puede ejecutarse, pero dejar el ambiente en mal estado. Puede chocar al salir. Puede fallar en cargar en absoluto.

Depende del comstackdor que esté utilizando, pero void main no se puede comstackr en todas partes. He visto comstackdores que no comstackn un progtwig con void main. No puedo recordar el caso particular (para c), pero estoy seguro de que esto sucede en g ++ (sí, sé que esto es c ++).

El estándar exige que main() devuelva int , pero muchos comstackdores de C le permiten especificar el tipo de retorno de main() como void .

Te recomiendo que adquieras el hábito de volver int . Añadiendo un

 return 0; 

hasta el final de tu main() no es demasiado esfuerzo.

Fui aceptable en C89 pero ya no se considera “seguro”. Bajo C99, ya no es aceptable.

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284376&answer=1044841143