En versiones anteriores de C, si una función no se declaraba previamente y su nombre aparecía en una expresión seguida de un paréntesis izquierdo, se declaraba implícitamente como una función que devuelve un int
y no se asumía nada sobre sus argumentos. En este caso, el compilador no podría realizar la comprobación en tiempo de compilación de los tipos de argumentos y la aridad de la sintaxis cuando la función se aplicara a algunos argumentos. Esto puede causar problemas. El siguiente código ilustra una situación en la que el comportamiento de una función declarada implícitamente es indefinido.
#include <stdio.h>/* If this prototype is provided, the compiler will catch the error in * |main|. If it is omitted, then the error may go unnoticed. */int MyFunction(int n); /* Prototype */int main( void ) /* Calling function */{ printf("%d\n", MyFunction()); /* Error: forgot argument to MyFunction */ return 0;}int MyFunction( int n ) /* Called function definition */{ if (n == 0) { return 1; } else { return n * MyFunction(n - 1); }}
La función MiFunción espera que un argumento entero esté en la pila o en un registro cuando es llamada. Si se omite el prototipo, el compilador no tendrá forma de hacer cumplir esto y MiFunción terminará operando en algún otro dato de la pila (posiblemente una dirección de retorno o el valor de una variable que no está actualmente en el ámbito). Al incluir el prototipo de la función, se informa al compilador de que la función MiFunción toma un argumento entero y se permite al compilador detectar este tipo de errores y hacer que el proceso de compilación funcione sin problemas. Esta característica se eliminó del estándar C99, por lo que la omisión de un prototipo de función dará lugar a un error de compilación.
Creación de interfaces de bibliotecaEditar
Colocando prototipos de función en un fichero de cabecera, se puede especificar una interfaz para una biblioteca.
Declaración de claseEditar
En C++, los prototipos de función también se utilizan en las definiciones de clase.