4.4.- El prototipo de una función
¿es obligatorio?


Cuando encuentra la primera invocación a una función, el compilador verifica si ya se realizó la declaración ó la definición de la función invocada. En caso de no existir ni declaración ni definición previa, enviará un mensaje de error diciendo que la función invocada debe tener un prototipo. En ese momento se detiene la compilación y no se genera el archivo .OBJ correspondiente.

Lo anterior puede sugerir que el prototipo de la función invocada es indispensable. La realidad es que se puede omitir el prototipo si escribimos la definición de la función antes de su primera invocación, como se muestra en el ejemplo 4.2.

 // ENCABEZADOS                                                
 #include <iostream.h>                                     
 #include <conio.h>                                             
 // DEFINICION DE LA FUNCION saludo()                          
 void saludo()                                                 
 {                                                             
   clrscr();                                                   
   cout << "!! BIENVENIDO A LA VENTA ESPECIAL !!"; } // DEFINICION DE LA FUNCION calcula() float calcula(float x) { return( x * 1.6); } // DEFINICION DE LA FUNCION PRINCIPAL int main() { float costo, precio; clrscr(); cout << "COSTO : $ "; cin>> costo;                                               
   saludo();                //INVOCACION A LA FUNCION saludo() 
   precio = calcula(costo); //INVOCACION A LA FUNCION calcula()
   cout << "PRECIO : $ " << precio; return 0; } 

Listado 4.2.- Diseño de funciones sin uso de prototipos.

Aunque el prototipo no es obligatorio, es recomendable utilizarlo, ya que de esta manera se permite al compilador verificar que el número y tipos de argumentos utilizados en la invocación (parámetros actuales) coinciden con los de la definición (parámetros formales).

La declaración de prototipos también sirve para que el usuario de un programa conozca la forma de utilización de la función, sin tener que proporcionarle el código fuente.
Por ejemplo, si tenemos un programa que maneja operaciones matemáticas podemos distribuir a los usuarios el código objeto que contenga las definiciones de las funciones y un archivo de cabecera que contenga los prototipos.

Los archivos pudieran tomar la forma mostrada a continuación:

 ARITME.OBJ    Archivo que contiene el código objeto, donde se 
               definen las funciones aritméticas.
 
 //ARITME.HPP: CONTIENE LOS PROTOTIPOS DE LAS FUNCIONES  
   double suma(double,double);                          
   double resta(double,double);                         
   ...........................                          
   ...........................                          


    //APLICA.CPP: PROGRAMA FUENTE ELABORADO POR             
    //            EL USUARIO                                
    #include <iostream.h>                                   
    #include "ARITME.HPP" //Incluye el archivo que contiene 
                          //los prototipos de las funciones 
                          //aritméticas                     
                                                            
    void main(void)                                         
    {                                                       
      double result, a=13500.45, b=16763.87;                
      result = suma(a,b); // Invocación a la función suma() 
                          // definida en ARITME.OBJ         
      cout << result; } 

Este es el criterio que se sigue al utilizar los archivos de cabecera que contiene el paquete compilador.

Por ejemplo, cuando se escribe la línea:

     #include <stdio.h>

se está incluyendo el archivo que contiene los prototipos de las funciones que se utilizan para el manejo de la entrada/salida estándar.

Página anterior Página siguiente