El �mbito, o visibilidad, de una variable nos indica en que lugares del programa est� activa esa variable. Hasta ahora, en los ejemplos que hemos visto, se han utilizado variables definidas en el cuerpo de funciones. Estas variables se crean en la memoria del ordenador cuando se llama a la funci�n y se destruyen cuando la funci�n termina de ejecutarse. Es necesario a veces, que una variable tenga un valor que pueda ser accesible desde todas las funciones de un mismo fuente, e incluso desde otros fuentes.
En C, el �mbito de las variables depende de d�nde han sido declaradas y si se les ha aplicado alg�n modificador. Una variable definida en una funci�n es, por defecto, una variable local. Esto es, que s�lo existe y puede ser accedida dentro de la funci�n. Para que una variable sea visible desde una funci�n cualquiera del mismo fuente debe declararse fuera de cualquier funci�n. Esta variable s�lo ser� visible en las funciones definidas despu�s de su declaraci�n. Por esto, el lugar m�s com�n para definir las variables globales es antes de la definici�n de ninguna funci�n. Por defecto, una variable global es visible desde otro fuente. Para definir que existe una variable global que est� definida en otro fuente tenemos que anteponer la palabra extern a su declaraci�n. Esta declaraci�n �nicamente indica al compilador que se har� referencia a una variable declarada en un m�dulo distinto al que se compila.
Las variables locales llevan impl�cito el modificador auto. Este indica que se crean al inicio de la ejecuci�n de la funci�n y se destruyen al final. En un programa ser�a muy ineficiente en t�rminos de almacenamiento que se crearan todas las variables al inicio de la ejecuci�n. Por contra, en algunos casos es deseable. Esto se consigue anteponiendo el modificador static a una variable local. Si una funci�n necesita una variable que �nicamente sea accedida por la misma funci�n y que conserve su valor a trav�s de sucesivas llamadas, es el caso adecuado para que sea declarada local a la funci�n con el modificador static. El modificador static se puede aplicar tambi�n a variables globales. Una variable global es por defecto accesible desde cualquier fuente del programa. Si, por cualquier motivo, se desea que una de estas variables no se visible desde otro fuente se le debe aplicar el modificador static. Lo mismo ocurre con las funciones. Las funciones definidas en un fuente son utilizables desde cualquier otro. En este caso conviene incluir los prototipos de las funciones del otro fuente. Si no se desea que alguna funci�n pueda ser llamada desde fuera del fuente en la que est� definida se le debe anteponer el modificador static.
void contar ( void ) { static long cuenta = 0; cuenta++; printf("Llamada%ld veces\n", cuenta ); }
Un modificador muy importante es const. Con �l se pueden definir variables cuyo valor debe permanecer constante durante toda la ejecuci�n del programa. Tambi�n se puede utilizar con argumentos de funciones. En esta caso se indica que el argumento en cuesti�n es un par�metro y su valor no debe ser modificado. Si al programar la funci�n, modificamos ese par�metro, el compilador nos indicar� el error.
#define EULER 2.71828 const double pi = 3.14159; double lcercle (const double r ) { return 2.0 * pi * r; } double EXP ( const double x ) { return pow (EULER, x ); } double sinh (const double x ) { return (exp(x) - exp(-x)) / 2.0; }
Debemos fijarnos que en el ejemplo anterior pi es una variable, la cual no podemos modificar. Por ello pi s�lo puede aparecer en un �nico fuente. Si la definimos en varios, al linkar el programa se nos generar� un error por tener una variable duplicada. En el caso en que queramos acceder a ella desde otro fuente, debemos declararla con el modificador extern.
Otro modificador utilizado algunas veces es el register. Este modificador es aplicable �nicamente a variables locales e indica al compilador que esta variable debe ser almacenada permanentemente en un registro del procesador del ordenador. Este modificador es herencia de los viejos tiempos, cuando las tecnolog�as de optimizaci�n de c�digo no estaban muy desarrolladas y se deb�a indicar qu� variable era muy utilizada en la funci�n. Hoy en d�a casi todos los compiladores realizan un estudio de qu� variables locales son las m�s adecuadas para ser almacenadas en registros, y las asignan autom�ticamente. Con los compiladores modernos se puede dar el caso de que una declaraci�n register inadecuada disminuya la velocidad de ejecuci�n de la funci�n, en lugar de aumentarla. Por ello, hoy en d�a, la utilizaci�n de este modificador est� en desuso, hasta el punto de que algunos compiladores lo ignoran. Se debe tener en cuenta que de una variable declarada como register no se puede obtener su direcci�n, ya que est� almacenada en un registro y no en memoria.