Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan un valor de salida o valor de retorno; aunque tanto unos como el otro pueden no existir.
Tal vez sorprenda que las introduzca tan pronto, pero como son una herramienta muy valiosa, y se usan en todos los programas C++, creo que debemos tener, al menos, una primera noción de su uso.
Al igual que con las variables, las funciones pueden declararse y definirse.
Una declaración es simplemente una presentación, una definición contiene las instrucciones con las que realizará su trabajo la función.
En general, la definición de una función se compone de las siguientes secciones, aunque pueden complicarse en ciertos casos:
Una función muy especial es la función "main". Se trata de la función de entrada, y debe existir siempre, será la que tome el control cuando se ejecute un programa en C. Los programas Windows usan la función WinMain() como función de entrada, pero esto se explica en otro lugar.
Existen reglas para el uso de los valores de retorno y de los parámetros de la función "main", pero de momento la usaremos como "int main()" o "int main(void)", con un entero como valor de retorno y sin parámetros de entrada. El valor de retorno indicará si el programa ha terminado sin novedad ni errores retornando cero, cualquier otro valor de retorno indicará un código de error.
En C++ es obligatorio usar prototipos. Un prototipo es una declaración de una función. Consiste en una definición de la función sin cuerpo y terminado con un ";". La estructura de un prototipo es:
<tipo> func(<lista de declaración de parámetros>);
Por ejemplo:
int Mayor(int a, int b);
Sirve para indicar al compilador los tipos de retorno y los de los parámetros de una función, de modo que compruebe si son del tipo correcto cada vez que se use esta función dentro del programa, o para hacer las conversiones de tipo cuando sea necesario. Los nombres de los parámetros son opcionales, y se incluyen como documentación y ayuda en la interpretación y comprensión del programa. El ejemplo de prototipo anterior sería igualmente válido y se podría poner como:
int Mayor(int,int);
Esto sólo indica que en algún lugar del programa se definirá una función "Mayor" que admite dos parámetros de tipo "int" y que devolverá un valor de tipo "int". No es necesario escribir nombres para los parámetros, ya que el prototipo no los usa. En otro lugar del programa habrá una definición completa de la función.
Normalmente, las funciones se declaran como prototipos dentro del programa, o se incluyen estos prototipos desde un fichero externo, (usando la directiva "#include", ver en el siguiente capítulo el operador de preprocesador.)
Ya lo hemos dicho más arriba, pero las funciones son "extern" por defecto. Esto quiere decir que son accesibles desde cualquier punto del programa, aunque se encuentren en otros ficheros fuente del mismo programa. En contraposición las funciones declaradas "static" sólo son accesibles dentro del fichero fuente donde se definen.
La definición de la función se hace más adelante o más abajo, según se mire. Lo habitual es hacerlo después de la función "main".
La estructura de un programa en C o C++ quedaría así:
[directivas del pre-procesador: includes y defines] [declaración de variables globales] [prototipos de funciones] [declaraciones de clases] función main [definiciones de funciones] [definiciones de clases]
Una definición de la función "Mayor" podría ser la siguiente:
int Mayor(int a, int b) { if(a > b) return a; else return b; }
Los programas complejos se escriben normalmente usando varios ficheros fuente. Estos ficheros se compilan separadamente y se enlazan juntos. Esto es una gran ventaja durante el desarrollo y depuración de grandes programas, ya que las modificaciones en un fichero fuente sólo nos obligarán a compilar ese fichero fuente, y no el resto, con el consiguiente ahorro de tiempo.
La definición de las funciones puede hacerse dentro de los ficheros fuente o enlazarse desde librerías precompiladas. La diferencia entre una declaración y una definición es que la definición posee un cuerpo de función.
En C++ es obligatorio el uso funciones prototipo, y aunque en C no lo es, resulta altamente recomendable.
extern y static.
© Septiembre de 2000 Salvador Pozo, salvador@conclase.net