2010-03-28 23 views
10
int main() { 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 
    system("pause"); 
    return main(); 
} 

Lo anterior funciona, pero codificó el main(), ¿hay una variable mágica para obtener la función de ejecución actual?¿Llamar a main() en sí mismo en C++?

+0

Si desea obtener un puntero de función o algo a la función actual, no creo que eso sea posible. –

+0

Eso es recursión infinita ... puede compilar, pero "funciona" no es del todo correcto. –

+22

Como comentario, POR FAVOR, no comenten cosas obvias. ¡Debería ser obvio que esa línea imprime !!! ¡Hola mundo! – Joe

Respuesta

10

El estándar C++ dice que no puede llamar a main() desde su propio código. En cuanto a conseguir el nombre de la función actual, podría utilizar la macro __FUNCTION__, pero una vez más esto no es estándar:

#include <iostream> 
using namespace std; 

void foo() { 
    cout << __FUNCTION__ << endl; 
} 

int main() { 
    foo(); 
} 

debe imprimir "foo" o algo similar si se admite __FUNCTION__.

+0

@Neil, \ _ \ _ FUNCTION \ _ \ _ va a ser una cadena ... no se puede invocar. –

+0

@Michael Lo sé. No estaba claro (no por primera vez) de lo que @Mask realmente estaba preguntando. Lo anterior es casi tan bueno como lo que obtendrás con respecto a los metadatos de función. –

+4

En términos de metadatos, \ _ \ _ func \ _ \ _ pronto será estándar. –

0

En general, no. Por ahora, será suficiente que sepa que el compilador necesita saber la función exacta a la que llama en el momento de la compilación. No se puede hacer magia como, digamos

func = "my_function"; 
func(); 

si el nombre de la función llamada cambiará durante el tiempo de ejecución. (Hay excepciones y formas de evitar eso, pero no es necesario).

No lo piense como un caso de codificación rígida: no lo es. Si necesita llamar a la función, escriba su nombre y no intente abstraerla, o algo así.

Además, ahora sería una buena manera de aprender sobre el bucle while, bucles infinitos y escribir sin la función llama a todos, por ejemplo

int main() 
{ 
    while (1) { 
     cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 
     system("pause"); 
    } 
} 
10

¿Está permitido en "C++"? No.

En la práctica, ¿puede llamar al main()? Sí.

Independientemente de lo que diga el Estándar C++, eso no impide que el compilador Linux g ++ compile código con main() en main().

#include <cstdlib> 
#include <iostream> 
using namespace std; 
int main() 
{ 
int y = rand() % 10; // returns 3, then 6, then 7 
cout << "y = " << y << endl; 
return (y == 7) ? 0 : main(); 
} 

Lo que nos permite hacer:

> g++ g.cpp; ./a.out 
y = 3 
y = 6 
y = 7 

Mirando a la asamblea, vemos que el principal se llama igual que cualquier otra función sería:

main: 
     ... 
     cmpl $7, -12(%rbp) 
     je  .L7 
     call main 
     ... 
.L7: 
     ... 
     leave 
     ret 

No es que este comportamiento está garantizado, pero parece que a g ++ no parece importarle realmente el estándar, aparte de esta advertencia sarcástica con -pedantic

g.cpp:8: error: ISO C++ forbids taking address of function '::main' 
2

Si una implementación específica permite esto, no se está comportando correctamente (a)). El estado estándar bastante explícita en C++14, 3.6.1 Main function /3:

La función main no deberá utilizarse dentro de un programa.


(a) Tenga en cuenta que muchas implementaciones siguen algunas partes de la norma sin apretar, prefiriendo poder sobre el rigor.Eso puede tener el desafortunado efecto secundario de que su código no sea portátil para otros compiladores o incluso para otras versiones del mismo compilador del mismo.

Muchas implementaciones también le permitirán tomar una vista más estricta, como usar g++ -std=c++11 -Werror=pedantic, que capta el problema específico adquirido en esta pregunta, así como algunas otras. Es que el "modo" de la traducción que permite a las implementaciones a reivindicar ser compatible con el estándar, como por 1.4 Implementation compliance:

Si un programa contiene una violación de cualquier norma diagnosticable ..., una aplicación conforme deberá emitir en al menos un mensaje de diagnóstico.

Usted verá que sigue siendo muy posible para permitir que el código para compilar y ejecutar en ese caso, ya que "el mensaje de diagnóstico" puede significar una advertencia en lugar de un error.

-2

una función no puede llamarse a sí misma pero podemos hacer un truco

#include<iostream> 
int main() 
{ 
int r=6; 
//we here can make a loop for the program to repeat itself with do{}while(r=6). 
do{ 
int a; 
cin>>a; 
if(a>5) 
cout<<"hi i repeat myself"; 
}while(r==6); 
return 0; 
} 
+4

Una función _puede llamarse a sí mismo, se llama 'recursividad'. Y C++ tiene recursividad. – YoYoYonnY

Cuestiones relacionadas