Funciones del prototipo C

4 minutos de lectura

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

Primero, ¿cada llamada de función fuera de la principal requiere una declaración de prototipo? ¿Hay alguna condición en la que eso pueda cambiar?

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

Funciones del prototipo C
CB Bailey

Las llamadas a funciones en C no requieren que un prototipo sea visible, pero se recomienda encarecidamente que se incluya 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 realizar las promociones predeterminadas de los argumentos de la función, 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 de argumentos predeterminados pueden causar discrepancias inesperadas.

P.ej

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 x no tiene prototipo visible (todavía), s será promovido a int y f será promovido a double. Estos son promociones de argumento predeterminado. Esto provoca un desajuste cuando la función se define con un prototipo que toma un short y un float aunque estos son los tipos originales de los argumentos que se pasaron.

Funciones que toman un número variable de argumentos (es decir, usan , ... sintaxis) siempre deben tener un prototipo visible en el punto en el que se llaman.

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 de una función siempre se someten a “promociones predeterminadas” antes de pasarse como parámetros, por lo que (por ejemplo) todos los tipos de enteros más pequeños se promocionan a inty float es ascendido a double. Por lo tanto, sin un prototipo, es imposible que una función reciba (por ejemplo) un char, shorto float. Si la función es definido para recibir uno de esos tipos, habrá una discrepancia entre lo que se pasa y lo que espera la función, dando un comportamiento indefinido (cualquier otra discrepancia también da un comportamiento indefinido).

En segundo lugar, si una función se define con una lista de argumentos variables, entonces hacer necesita un prototipo para ello, o llamarlo resultará en un comportamiento indefinido.

No, no se requiere que las funciones tengan prototipos. Sin embargo, son útiles ya que permiten llamar a las funciones antes de declararlas. Por ejemplo:

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

void function_x()
{

}

Si agrega un prototipo arriba main (esto generalmente se hace en un archivo de encabezado) le permitiría llamar function_xaunque 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 funciones en él.

C no tiene sobrecarga de funciones, por lo que esto es irrelevante.

  • Donde haya comentado no causará un error de compilación. function_x(); declarará implícitamente function_x(); como una función sin prototipo que devuelve un int. Es un error que la función se declare posteriormente como retornante voidaunque.

    –CB Bailey

    6 de febrero de 2011 a las 16:43

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 de forma predeterminada si faltan prototipos antes de la llamada a la función, pero este comportamiento no es necesariamente un estándar.

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

Por supuesto, ya que eres nuevo en C. Creo que es mejor que vayas y busques la diferencia entre un Prototipo y la Definición de una función para que tenga pleno sentido.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad