2010-05-06 11 views
8

En C static puede significar una variable local o una función/variable global sin enlace externo. En C++ también puede significar una variable de miembro por clase o función de miembro.¿Cómo sucedió que "estático" denota una función/variable sin enlace externo en C y C++?

¿Hay alguna referencia a cómo sucedió que la palabra clave static que parece totalmente irrelevante para la falta de enlaces externos se utiliza para denotar la falta de vinculación externa?

Respuesta

4

static es un especificador de almacenamiento. La palabra "estático" significa inmutable. "Almacenamiento" se refiere a dónde está el objeto en la memoria, es decir, su dirección.

Un objeto con almacenamiento static reside en una dirección constante.

Sucede que un objeto con almacenamiento extern también tiene una dirección constante. Debido a la forma en que los programas C y C++ están vinculados, es una necesidad. Y dado que extern es el comportamiento menos sorprendente, también es el predeterminado.

Si lo piensas en términos de extern siendo una característica adicional en la parte superior de static, creo que tiene un poco más de sentido. Es un poco estúpido declarar una función static, ya que no hay alternativa en ningún lenguaje completamente compilado, pero la dirección de una función es estática, incluso si no está visible externamente.

La parte realmente inconsistente, entonces, es que los miembros de clase que se comparten entre diferentes unidades de compilación deben ser declarados static, no extern ...

6

El uso de una palabra clave ya existente tiene la ventaja de no agregar una nueva palabra clave al idioma, lo que podría romper los programas existentes. Puede ser confuso, pero se considera una especie de "mal menor".

+3

Y la estática tiene, como mucho la palabra clave C++, un significado dependiente del contexto. – Klaim

6

Supongo que considera el uso de estática para definir variables que conservan su valor entre las llamadas a funciones para ser naturales.

considerar lo siguiente:

void func() { 
    static int x; 
} 

frente

int x; 
void func() { 
} 

Desde el punto de vista func 's, x comporta de la misma en ambos casos. El valor permanece entre llamadas consecutivas. La diferencia entre los dos es quién más puede ver x. En el primero, nadie puede. En el segundo, todos pueden.

Ese concepto se extiende a las variables estáticas en el ámbito global. Si solo declaras una variable, todos pueden verla. Pero si declara que la variable estática, solo ese archivo puede verla. Obviamente, debe tener en cuenta el hecho de que no existe un alcance adicional para limitar la visibilidad, pero la idea está ahí.

El significado adicional en C++ con respecto a los miembros estáticos es también directamente análogo al ejemplo original. Una sola variable compartida por todas las instancias de la clase.

+0

No estoy del todo contento con mi redacción aquí: -/Básicamente, lo que estoy tratando de transmitir es que los tres usos esencialmente dan como resultado una variable global que se limita al alcance actual. –

+0

Esa es ** exactamente ** la razón. ¡No entiendo cómo la respuesta anterior (totalmente inútil) tiene más votos! – Shahbaz

+0

Sin embargo, el significado de variable de clase arroja una llave en la parte "limitado al alcance actual". 'clase X {public: static int foo; }; 'declara un' X :: foo' globalmente visible (aunque uno que requiera el calificador 'X ::'). – cHao

2

La versión C significa "enlazado estáticamente" fuera de una función.

La versión de la clase C++ y las versiones de la función C inside significan "almacenadas estáticamente", lo que significa que no son auto (pila o locales) variables o variables de instancia en las clases.

Cuestiones relacionadas