El propósito entero y completo de static
es declarar que una variable es privada en el archivo de origen que se declara en. Por lo tanto, está haciendo precisamente su trabajo para evitar una conexión desde un exterior.
Tenga en cuenta que hay cuatro sabores de archivos ámbito de definición de variables:
int blah = 0;
- bla se definen en este archivo y accesibles desde otros archivos. Las definiciones en otros archivos son duplicados y darán lugar a errores.
extern int blah;
- blah debe definirse en cualquier otro lugar y se hace referencia a este archivo.
int blah;
- Este es el equivalente moral de FORTRAN COMMON
. Puede tener cualquier cantidad de estos en los archivos, y el vinculador los resuelve a uno compartido int
. (*)
static int blah;
(opcionalmente con un inicializador) - Esto es estático. Es completamente privado para este archivo. No es visible para externos en otros archivos, y puede tener muchos archivos diferentes que declaran static TYPE blah;
, y todos son diferentes.
Para los puristas de la audiencia: 'archivo' = unidad de compilación.
Tenga en cuenta que las funciones internas estáticas (no en el alcance del archivo) son aún más estrictas: si dos funciones declaran static int bleh = 0;
incluso en el mismo archivo, no están relacionadas.
(*): para aquellos que no están familiarizados: en el patrón habitual, una unidad de compilación tiene que definir una variable global, y otros pueden hacer referencia a ella. 'Vive' en esa unidad de compilación. En el caso (3), arriba, ningún archivo (o todos los archivos) lo define. Si dos archivos dicen int blah = 0;
, el enlazador se quejará de múltiples definiciones. Si dos archivos dicen int blah;
, el enlazador crea alegremente un único int
global y hace que todo el código se refiera a él.
¿cómo se llamaría 'int n' (en el alcance del archivo), en términos de especificadores de almacenamiento? –
@bmargulies: ¿En el alcance del archivo, quieres decir? Porque en el alcance de la función, una var estática es aquella que conserva su valor después de que las funciones regresen, y en el alcance de la clase, un miembro estático tiene una única instancia disponible para todos los objetos. – mingos
Aclarado por la edición, confío. – bmargulies