2012-06-18 7 views
7

Estaba viendo el código que me envió un amigo y me dijo: "Compila, pero no funciona". Vi que utiliza las funciones sin los paréntesis, así:¿Por qué el compilador C++ no se queja cuando uso funciones sin paréntesis?

void foo(){ 
    cout<< "Hello world\n"; 
} 

int main(){ 
    foo; //function without parentheses 
    return 0; 
} 

El primero que dije fue "paréntesis uso, hay que". Y luego probé ese código: compila, pero cuando se ejecuta no funciona (no se muestra "Hello world").

Entonces, ¿por qué se compila (sin advertencia del compilador GCC 4.7), pero no funciona?

+0

Realmente funciona. 'foo' se trata como es, un puntero a la función. La línea 'foo;' es solo una línea sin efecto. Si cambia sus advertencias al máximo, debería recibir una advertencia sobre una declaración sin efecto. – RedX

+0

Veo * "advertencia: instrucción es una referencia, no llamada, para funcionar 'foo'" * y * "advertencia: instrucción no tiene efecto" *. Probablemente quiera compilar con -Wall -Wextra – Flexo

+3

(Para preguntas futuras, vale la pena ponerlo en '#include 'y cualquier espacio de nombres para completar su muestra) – Flexo

Respuesta

12

Sin duda advierte si configura el nivel de advertencia lo suficientemente alto.

Un nombre de función evalúa la dirección de la función y es una expresión legal. Por lo general, se guarda en un puntero de función,

void (*fptr)() = foo; 

pero eso no es necesario.

11

Necesita aumentar el nivel de advertencia que usa. foo; es una declaración de expresión válida (el nombre de una función se convierte en un puntero a la función nombrada) pero no tiene ningún efecto.

lo general el uso -std=c++98 -Wall -Wextra -pedantic que da:

<stdin>: In function 'void foo()': 
<stdin>:2: error: 'cout' was not declared in this scope 
<stdin>: In function 'int main()': 
<stdin>:6: warning: statement is a reference, not call, to function 'foo' 
<stdin>:6: warning: statement has no effect 
3
foo; 

Usted no es realmente 'utilizar' la función aquí. Solo estás usando su dirección. En este caso, lo estás tomando pero no realmente lo estás usando.

Las direcciones de las funciones (es decir sus nombres, sin ningún paréntesis) son útiles cuando se desea pasar que funcionan como una devolución de llamada a alguna otra función.

Cuestiones relacionadas