2011-02-06 12 views
6

Como principiante de C, puedo entender la necesidad de prototipos de funciones en el archivo, pero no estoy seguro de algunas cosas.C funciones de prototipo

En primer lugar, ¿cada llamada de función fuera de la principal requiere una declaración de prototipo? ¿Hay alguna condición donde eso pueda cambiar?

En segundo lugar, ¿necesita un prototipo de función independiente para las sobrecargas de métodos?

Respuesta

8

Las llamadas a función en C no requieren que un prototipo sea visible, pero se recomienda encarecidamente que esté dentro del alcance de un prototipo correcto.

La razón de esto es que si la definición de la función no coincide con los tipos de los argumentos de la función después de que se realizan las promociones del argumento de la función predeterminada, es muy probable que obtenga un comportamiento indefinido.

Tener visible el prototipo correcto significa que el compilador puede verificar los argumentos de una llamada de función y advertir al programador si hay una discrepancia.

C no permite que las funciones se sobrecarguen, por lo que solo puede tener un único prototipo para cualquier nombre de función.

Las promociones predeterminadas de los argumentos pueden causar desajustes inesperados.

E.g.

int main(int argc, char **argv) 
{ 
    short s = 5; 
    float f = 2.3f; 
    x(s, f);  // x implicitly declared; default argument promotions performed 
    return 0; 
} 

int x(short t, float g) // Error: called with an int and a double 
{ 
    return (int)(t + g); 
} 

En la llamada a la función, porque no tiene x prototipo visible (aún), s será promovido a int y f será promovido a double. Estas son promociones por argumento predeterminadas. Esto provoca una falta de coincidencia cuando la función se define con un prototipo que toma short y float aunque estos sean los tipos originales de los argumentos que se pasaron.

Funciones que toman una cantidad variable de argumentos (es decir, uso , ... sintaxis) siempre debe tener un prototipo visible en el punto en el que se llaman.

1

No, no se requieren funciones para tener prototipos. Sin embargo, son útiles ya que permiten llamar a las funciones antes de que se declaren. Por ejemplo:

int main(int argc, char **argv) 
{ 
    function_x(); // undefined function error 
    return 0; 
} 

void function_x() 
{ 

} 

Si se agrega un prototipo anterior main (esto se suele hacer en un archivo de cabecera) que permitiría que llame function_x, a pesar de que se define después main. Es por eso que cuando usa una biblioteca externa que necesita vincularse, incluye el archivo de encabezado con todos los prototipos de función.

C no tiene sobrecarga de función, por lo que esto es irrelevante.

+2

Donde ha comentado no provocará un error de compilación. 'function_x();' declarará implícitamente 'function_x();' como una función sin prototipo que devuelve un 'int'. Sin embargo, es un error que la función se declare posteriormente como 'void'. –

0

No. En C no todas las funciones requieren un prototipo. PERO es una buena práctica incluirlo. Los prototipos ayudan al compilador a detectar errores. Por supuesto, algunos compiladores de C se quejan si faltan prototipos antes de la llamada a la función, pero este comportamiento no es necesariamente un estándar.

La lógica anterior se aplica a las sobrecargas también.

Por supuesto, ya que es nuevo en C.Creo que será mejor que busque la diferencia entre un prototipo y la definición de una función para tener pleno sentido.

+0

¡Uy, C no tiene sobrecarga! gracias a @Tim Cooper. – Outspoken

+0

Es una buena disciplina de programación para asegurarse de que encuentra la opción del compilador que garantiza que todas las funciones se declaran con un prototipo completo antes de ser utilizadas, y para asegurarse de usar la opción del compilador todo el tiempo, y prestar atención a sus advertencias. –

4

Otros ya han señalado que C no requiere prototipos para funciones. Solo agregaré un par de puntos menores.

En primer lugar, sin un prototipo, los argumentos a una función siempre se someten a "promociones por defecto" antes de ser pasados ​​como parámetros, por lo que (por ejemplo) todos los tipos enteros más pequeños son ascendidos a int, y float es ascendido a double . Por lo tanto, sin un prototipo, es imposible que una función reciba (por ejemplo) un char, short o float. Si la función es definida para recibir uno de esos tipos, habrá una discrepancia entre lo que se pasó y lo que espera la función, lo que da un comportamiento indefinido (cualquier otro desajuste también proporciona un comportamiento no definido).

En segundo lugar, si una función se define con una lista de argumentos variable, entonces se hace necesita un prototipo para ello, o bien llamando a que dará lugar a un comportamiento indefinido.

Cuestiones relacionadas