2009-11-03 32 views

Respuesta

18

Hay algunas razones para utilizar static en C.

Cuando se utiliza con las funciones, si la intención es que la creación de la abstracción. El término original para el alcance de un archivo de código fuente C era "unidad de traducción". Las funciones estáticas solo se pueden alcanzar desde dentro de la misma unidad de traducción. Estas funciones estáticas son similares a los métodos privados en C++, liberalmente interpretados (en esa analogía, una unidad de traducción define una clase).

Los datos estáticos a nivel global tampoco son accesibles desde fuera de la unidad de traducción, y esto también se utiliza para crear una abstracción. Además, todos los datos estáticos se inicializan a cero, por lo que se puede usar static para controlar la inicialización.

El nivel variable estático ("automático") local se utiliza para abstraer la implementación de la función que mantiene el estado entre llamadas, pero evita usar una variable al alcance de la unidad de traducción. De nuevo, las variables se inicializan a cero debido a la calificación estática.

8

La palabra clave static tiene varios usos; Fuera de una función, simplemente limita la visibilidad de una función o variable a la unidad de compilación (archivo .c) en la que aparece la función o variable. De esta forma, la función o variable no se convierte en global. Esto es algo bueno, promueve una especie de principio de "necesidad de saber" (no exponga las cosas que no necesitan ser expuestas). Las variables estáticas de este tipo se inicializan en cero, pero por supuesto las variables globales también se inicializan en cero, por lo que la palabra clave estática no es responsable de la inicialización cero per se.

Las variables también se pueden declarar estáticas dentro de una función. Esta característica significa que la variable no es automática, es decir, asignada y liberada en la pila con cada invocación de la función. En cambio, la variable se asigna en el área de datos estáticos, se inicializa a cero y persiste durante la vida del programa. Si la función lo modifica durante una invocación, el nuevo valor modificado estará disponible en la siguiente invocación. Esto suena como algo bueno, pero hay buenas razones por las cuales "automático" es el predeterminado, y las variables "estáticas" dentro de las funciones se deben usar con moderación. En pocas palabras, las variables automáticas son más eficientes en la memoria, y son esenciales si desea que su función sea segura para subprocesos.

6

static se utiliza como storage class specifier y linkage specifier. Como especificador de vinculación, restringe el alcance de una variable o función que de otro modo sería global a una sola unidad de compilación. Esto permite, por ejemplo, una unidad de compilación tener variables y funciones con los mismos nombres de identificador que otras unidades de compilación, pero sin causar un choque, ya que tales identificadores están 'ocultos' del enlazador. Esto es útil si está creando una biblioteca, por ejemplo, y necesita funciones internas de 'ayuda' que no deben causar un conflicto con el código de usuario.

Como un especificador de clase de almacenamiento aplicado a una variable local, tiene una semántica diferente por completo, pero su pregunta parece implicar que se está refiriendo a la vinculación estática.

0

funciones estáticas en C

En C, las funciones son globales por defecto. La palabra clave "estática" antes de un nombre de función lo hace estático. Por ejemplo, debajo de fun fun() es estático.

static int fun(void) 
{ 
    printf("I am a static function "); 
} 

diferencia de las funciones globales en C, el acceso a funciones estáticas se limita al archivo en el que se declaran.Por lo tanto, cuando queremos restringir el acceso a las funciones, las hacemos estáticas. Otra razón para hacer que las funciones sean estáticas puede ser la reutilización del mismo nombre de función en otros archivos.

Por ejemplo, si Almacenamos siguiente programa en un archivo Archivo1.c

/* Inside file1.c */ 
static void fun1(void) 
{ 
    puts("fun1 called"); 
} 

y tienda del siguiente programa en otro archivo Archivo2.c

/* Iinside file2.c */ 
int main(void) 
{ 
    fun1(); 
    getchar(); 
    return 0; 
} 

Ahora bien, si se compila el código anterior con el comando "gcc file2.c file1.c", obtenemos el error "referencia indefinida a fun1’” . This is because fun1() is declared estática" en file1.c y no se puede utilizar en file2.c. Vea también el explanation here, de donde provienen los códigos.

Cuestiones relacionadas