En programación informática , un prototipo de función es una declaración de una función que especifica su nombre y firma de tipo ( aridad , tipos de datos de los parámetros y tipo de retorno ), pero omite el cuerpo de la función. Mientras que la definición de una función especifica cómo la función realiza su función (la "implementación"), un prototipo de función simplemente especifica su interfaz, es decir, qué tipos de datos entran y salen de ella. El término "prototipo de función" se utiliza particularmente en el contexto de los lenguajes de programación C y C++, donde colocar las declaraciones anticipadas de funciones en archivos de cabecera permite dividir un programa en unidades de traducción , es decir, en partes que un compilador puede traducir por separado a archivos objeto , para luego ser combinadas por un enlazador en un ejecutable o una biblioteca . La declaración de la función precede a la definición de la función, proporcionando detalles como el nombre, el tipo de retorno y la clase de almacenamiento, junto con otros atributos relevantes. [ 1 ]
Los prototipos de función se pueden utilizar cuando: [ 2 ]
- Definir un tipo externo
- Creación de una parte de la interfaz
En un prototipo, los nombres de los parámetros son opcionales (y en C/C++ tienen ámbito de prototipo de función , lo que significa que su ámbito termina al final del prototipo); sin embargo, el tipo es necesario junto con todos los modificadores (por ejemplo, si es un puntero o una referencia a un parámetro constante ), excepto `const` solo.
En la programación orientada a objetos , las interfaces y los métodos abstractos cumplen prácticamente la misma función.
Ejemplo
Considere el siguiente prototipo de función:
void suma ( int a , int b );// sin parámetros con nombre: void sum ( int , int );// con tipos de retorno finales (C++): auto sum ( int , int ) -> void ;Los prototipos de función incluyen la firma, el nombre, el tipo de retorno y el especificador de acceso. En este caso, la función se llama "sum". La firma define el número de parámetros y sus tipos. El tipo de retorno es "void", lo que significa que la función no devolverá ningún valor. Cabe destacar que los nombres de los parámetros en el primer ejemplo son opcionales.
Usos
En las primeras versiones de C, si una función no se había declarado 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 devolvía un valor inty no se asumía nada sobre sus argumentos. En este caso, el compilador no podía realizar una comprobación de validez en tiempo de compilación del número y tipo(s) de argumentos. El estándar C99 exige el uso de prototipos.
#include <limits.h> #include <stdio.h>// Prototipo de función char orderingCharacter ( int n );int main () { putchar ( orderingCharacter ( -1 )); // Llamada formateada correctamente putchar ( orderingCharacter ( 1.5 )); // Advertencia del compilador: incompatibilidad de tipos putchar ( orderingCharacter ( "Hello" )); // Advertencia del compilador: incompatibilidad de tipos putchar ( orderingCharacter ()); // Error del compilador: muy pocos argumentos// Aunque sumar 1 a INT_MAX es un error de desbordamiento de enteros, // no se puede detectar en tiempo de compilación putchar ( orderingCharacter ( INT_MAX + 1 )); }// Definición de la función char orderingCharacter ( int n ) { if ( n > 0 ) { return '>' ; } else if ( n < 0 ) { return '<' ; } return '=' ; }La función orderingCharacter()espera ser llamada con un argumento entero. Al incluir el prototipo de la función, le informas al compilador que la función acepta un argumento entero y le permites detectar llamadas especificadas incorrectamente.
Creación de interfaces de biblioteca
Al colocar los prototipos de las funciones en un archivo de cabecera , se puede especificar una interfaz para una biblioteca .
Declaración de clase
En C++, los prototipos de funciones también se utilizan en las definiciones de clases .
En Java y C# , las interfaces se declaran con firmas, que luego son implementadas por la clase que las implementa.
interface PaymentProcessor { boolean processPayment ( double amount , String currency ); String getReceiptDetails (); void refundPayment ( String transactionId ); }clase CreditCardProcessor implementa PaymentProcessor { private double lastAmount ; private String lastTransactionId ;@Override public boolean processPayment ( double amount , String currency ) { this.lastAmount = amount ; this.lastTransactionId = " TXN" + System.currentTimeMillis ( ) ; System.out.printf ( "Procesando pago con tarjeta de crédito de %f % s ... % n " , amount , currency ) ; return true ; }@Override public String getReceiptDetails () { return String . format ( "Recibo para ID %s | Importe: $%f" , lastTransactionId , lastAmount ); }@Override public void refundPayment ( String transactionId ) { System . out . printf ( "Reembolsando transacción: %s...%n" , transactionId ); } }Véase también
Referencias
- Kernighan, Brian W.; Ritchie , Dennis M. (1988). El lenguaje de programación C (2.ª ed.). Upper Saddle River, NJ: Prentice Hall PTR. ISBN 0-13-110362-8.
- Subrutinas
- Familia de lenguajes de programación C
- Programación informática