¿Por qué el tipo de función principal en C y C ++ se deja al usuario para definir?

¿Por qué main() una función definida por el usuario?

¿Cuándo usaré void main() e int main() ?

EDITAR Esta respuesta no es tan completa como podría ser, ya que realmente no aborda la frase extraña “o de otra manera de alguna manera definida por la implementación”. Ahora he escrito una respuesta más completa que también aborda C90, C11 y C ++. FIN DE EDICION

Esto es lo que dice el estándar C (ISO C 9899: 1999):

5.1.2.1 Entorno independiente

En un entorno independiente (en el que la ejecución del progtwig C puede tener lugar sin ningún beneficio de un sistema operativo), el nombre y el tipo de la función llamada al inicio del progtwig están definidos por la implementación. / .. / El efecto de la terminación del progtwig en un entorno independiente está definido por la implementación.

5.1.2.2 Entorno hospedado

No es necesario proporcionar un entorno alojado, pero debe cumplir con las siguientes especificaciones, si están presentes.

5.1.2.2.1 Inicio del progtwig

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 (a los que se hace referencia aquí como argc y argv, aunque se pueden usar los nombres, ya que son locales para la función en la que se declaran):

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

El texto en el estándar C ++ es más o menos idéntico. Tenga en cuenta que el “inicio del progtwig” en el texto es una subcláusula del entorno alojado.

Esto significa:

  • Si su progtwig se ejecuta en un entorno hostless (su progtwig es un sistema integrado o un sistema operativo), puede tener cualquier tipo de devolución. void main () es lo más común.

  • Si su progtwig se ejecuta en un entorno alojado (en la parte superior de un sistema operativo), main () debe devolver int, y puede tener parámetros adicionales.

Lundin tiene razón acerca de C, pero en C ++ la redacción es lo suficientemente distinta como para marcar la diferencia:

[C++11: 3.6.1/1]: un progtwig debe contener una función global llamada main , que es el inicio designado del progtwig. Está definido por la implementación si se requiere un progtwig en un entorno independiente para definir una función main .

[C++11: 3.6.1/2]: una implementación no debe predefinir la función main . Esta función no debe estar sobrecargada. Tendrá un tipo de retorno de tipo int , pero de lo contrario su tipo está definido por la implementación [..]

El primer pasaje en negrita no anula ni cancela el segundo.

main retornos int en C ++, siempre.

El tipo de retorno para main está determinado por la implementación, no por el progtwigdor. Verifique la documentación de su comstackdor para ver cuáles son las firmas legales main . No asum que void main() es uno de ellos. En un entorno alojado, main normalmente devuelve int . En un entorno freestandaing, el punto de entrada puede que ni siquiera se llame main , pero su tipo de devolución seguirá determinado por la implementación, no por el progtwigdor.

Hay 3 situaciones:

  1. implementación independiente
  2. conformando la implementación alojada sin extensiones
  3. implementación alojada con extensiones

En 1. no es necesario que haya una función llamada main en absoluto. La implementación define cómo se inicia un progtwig.

En 2. un progtwig comienza a ejecutarse en una función llamada main , definida con una de las siguientes 2 ‘firmas’: int main(void) o int main(int argc, char **argv)

En 3. un progtwig comienza a ejecutarse en una función llamada main , definida como permitida por la implementación. Esta función debe devolver int para cumplir con los estándares. Por ejemplo: int main(int argc, char **argv, char **envp) o int main(wchar_t**) . Tenga en cuenta que los progtwigs que usan estos formularios no son necesariamente válidos en todas las implementaciones alojadas (y pueden ser inválidas para el autor original si la implementación cambia).

Originalmente, en el lenguaje C, no existía el tipo void y, por lo tanto, la función tenía que devolver int .

En la práctica, int permite ejecutar otro proceso desde su proceso (usando fork y exec ) y si puede obtener el resultado de retorno de ese proceso sabrá si funcionó o no.

Muchos comstackdores no son compatibles con void main (), por lo tanto, siempre debe usar int main ().