2011-01-18 24 views
20

¿Hay un uso para marcar una variable como static, cuando se encuentra en el ámbito global de un archivo .cpp, no en una función?Uso de variables estáticas y funciones en el alcance global

¿Se puede usar la palabra clave estática para funciones también? Si es así, ¿cuál es su uso?

+2

Suena como tarea –

+27

Suena como si alguien llamara algo a la tarea –

Respuesta

14

En este caso, palabra clave static significa que la función o variable solo puede ser utilizada por código en el mismo archivo cpp. El símbolo asociado no se exportará y otros módulos no podrán usarlo.

Esta es una buena práctica para evitar conflictos de nombres en el software grande cuando sabe que sus funciones globales o variables no son necesarias en otros módulos.

+11

En C++ uno debe usar espacios de nombres sin nombre. –

16

Sí, si desea declarar la variable de ámbito de archivos, entonces es necesaria la palabra clave static. static variables declaradas en una unidad de traducción no pueden ser referidas desde otra unidad de traducción.


Por cierto, el uso de static palabra clave está en desuso en C++ 03.

La sección 7.3.1.1 $/2 del estándar de C++ (2003) lee,

El uso de la palabra clave estática es obsoleto al declarar objetos en un ámbito espacio de nombres; el namespace sin nombre proporciona una alternativa superior .

C++ prefiere no identificado espacio de nombres sobre static palabra clave. Ver este tema:

Superiority of unnamed namespace over static?

+6

Y el último borrador de C++ 0x lo supera. –

+2

@Fred: ¡¡eso es interesante !! – Nawaz

+0

@Fred: entretenido, cambió entre n3092 y n3225, ¿sabes lo que motivó este cambio? –

1

Tomando como ejemplo -

// At global scope 
int globalVar; // Equivalent to static int globalVar; 
       // They share the same scope 
       // Static variables are guaranteed to be initialized to zero even though 
       // you don't explicitly initialize them. 


// At function/local scope 

void foo() 
{ 
    static int staticVar ; // staticVar retains it's value during various function 
          // function calls to foo();     
} 

Ambos dejan de existir sólo cuando el programa termina/salidas.

+0

Pero, ¿la variable estática de ámbito de función se inicializa en tiempo de ejecución o solo cuando se ejecuta su función de ámbito, en este caso foo()? –

+0

@Mahesh ¿No es globalVar no estático si no especifica estática por defecto? Creo que se pueden extender fácilmente las variables globales no estáticas. – starkk92

Cuestiones relacionadas