¿Es legal recurse en main () en C ++?

Leí que el estándar de C ++ prohíbe la recursión en main() , pero g ++ comstack el siguiente código sin queja:

 int main() { main(); } 

¿Alguien puede aclarar esto?

De acuerdo con el estándar en 3.6.1 / 3, no es:

La función main no se utilizará (3.2) dentro de un progtwig

La definición de ser utilizado :

Se usa un objeto o función no sobrecargada si su nombre aparece en una expresión potencialmente evaluada .

Haré el pescado y explicaré por qué esto está prohibido . Antes de que un progtwig C o C ++ pueda comenzar a ejecutarse, primero debe inicializarse el CRT. Abra stdin / out / err, invoque inicializadores, ese tipo de cosas. Hay dos estrategias básicas para hacer esto, un detalle de implementación de plataforma pesada.

  • La dirección de inicio del progtwig apunta a la función de inicio de CRT, que finalmente llama a main (). Común en los sistemas operativos con todas las funciones que tienen un cargador elegante que puede admitir secciones arbitrarias en la imagen ejecutable.

  • El comstackdor inyecta el código en la función main () que llama a la función de inicialización de CRT. La función de inicio siempre es main (). Común en plataformas integradas con capacidades limitadas de cargador. Recurriendo a main () es ahora un problema, el código de inicio de CRT se llamará de nuevo con un estado de stack impredecible.

La afirmación aquí es que está específicamente prohibida:

Bueno, el estándar dice:

3.6.1.3
“La función main no se usará dentro de un progtwig”.

5.2.2.9
“Se permiten llamadas recursivas, excepto para la función llamada principal”

Usted puede, por supuesto, hacer esto:

 int main(int argc, char* argv[]) { return foo(argc, argv); } int foo(int argc, char* argv[]) { if (some_condition) { return foo(argc, argv); } return 0; } 

(Nota: agregué una cláusula de salida. Ni siquiera puedo hipotéticamente codificar la recursión infinita, se repite en mí).

No es legal Lee 3.6.1-3:

La función main no se utilizará (3.2) dentro de un progtwig. El enlace (3.5) de main está definido por la implementación. Un progtwig que declara que main está en línea o estático está mal formado. El nombre principal no está reservado de otra manera. [Ejemplo: las funciones miembro, las clases y las enumeraciones se pueden llamar main, al igual que las entidades en otros espacios de nombres. ]

Otras personas han abordado la parte de estándares. Sin embargo, me gustaría señalar que g ++ (al menos 4.6.2) rechazará esto si usa -pedantic-errors con al menos uno de estos errores (dependiendo de la firma main ):

 error: ISO C++ forbids calling '::main' from within program [-pedantic] error: ISO C++ forbids taking address of function '::main' [-pedantic]