2011-08-21 12 views
22

Decir que tengo esta función:¿Por qué puedo invocar una función mediante un puntero con demasiados argumentos?

int func2() { 
    printf("func2\n"); 
    return 0; 
} 

Ahora declarar un puntero:

int (*fp)(double); 

Esto debería apuntar a una función que toma un argumento y devuelve un doubleint.

func2 no tiene ningún argumento, pero aún cuando escribo:

fp = func2; 
fp(2); 

(con 2 ser sólo un número arbitrario), func2` se invoca correctamente.

¿Por qué es eso? ¿No tiene sentido la cantidad de parámetros que declaro para un puntero de función?

+0

la respuesta corta es "declarar una función sin argumentos ... y luego pasa deliberadamente un argumento ... es simplemente incorrecto". – paulsm4

Respuesta

46

Sí, hay un significado. En C (pero no en C++), una función declarada con un conjunto vacío de paréntesis significa que toma un no especificado cantidad de parámetros. Cuando haces esto, impides que el compilador verifique el número y los tipos de argumentos; es un remanente antes de que el lenguaje C fuera estandarizado por ANSI e ISO.

No poder invocar una función con el número y los tipos de argumentos adecuados da como resultado comportamiento indefinido. Si se declara en vez de forma explícita su función para tomar parámetros cero mediante el uso de una lista de parámetros de void, entonces el compilador le dará una advertencia cuando se asigna un puntero de función del tipo incorrecto:

int func1(); // declare function taking unspecified parameters 
int func2(void); // declare function taking zero parameters 
... 
// No warning, since parameters are potentially compatible; calling will lead 
// to undefined behavior 
int (*fp1)(double) = func1; 
... 
// warning: assignment from incompatible pointer type 
int (*fp2)(double) = func2; 
-4

Es necesario declarar explícitamente el parámetro, de lo contrario obtendrá un comportamiento indefinido :)

int func2(double x) 
{ 
    printf("func2(%lf)\n", x); 
    return 0; 
} 
Cuestiones relacionadas