que - manejo de memoria en c++
¿Por qué y cuándo usar estructuras estáticas en la programación C? (5)
He visto declaraciones de estructuras estáticas con bastante frecuencia en un código de controlador que se me pidió que modificara.
Intenté buscar información sobre por qué las structs
se declaran estáticas y la motivación para hacerlo.
¿Alguien puede ayudarme a entender esto?
Algo que aparentemente todas las otras respuestas parecen perderse: static
y especifica también una duración de almacenamiento para un objeto, junto con las variables automáticas (variables locales) y asignadas (memoria devuelta por malloc y amigos).
Los objetos con duración de almacenamiento estático se inicializan antes de que se inicie main (), ya sea con el inicializador especificado o, si no se proporcionó ninguno, como si se le hubiera asignado 0 (para structs y matrices esto se aplica a cada miembro y recursivamente).
La segunda propiedad static
establece para un identificador, es su enlace , que es un concepto utilizado en el tiempo del enlace y le dice al vinculador qué identificadores se refieren al mismo objeto. La palabra clave static
hace que un identificador tenga un enlace interno , lo que significa que no puede hacer referencia a los identificadores del mismo nombre en otra unidad de traducción.
Y para ser pedantes sobre todas las respuestas descuidadas que he leído antes: una variable estática no se puede hacer referencia en todas partes en el archivo que se declara. Su alcance es solo desde su declaración (que puede ser entre definiciones de funciones) hasta el final del archivo fuente, o incluso más pequeño, hasta el final del bloque circundante.
El modificador static
para la struct
limita el alcance de visibilidad de la estructura a la unidad de traducción actual (es decir, el archivo).
NOTA: Esta respuesta asume (como otros respondedores han indicado) que su declaración no está dentro de una función.
La palabra clave static
en C tiene varios efectos, según el contexto al que se aplique.
- cuando se aplica a una variable declarada dentro de una función, el valor de esa variable se conservará entre las llamadas a funciones.
- cuando se aplica a una variable declarada fuera de una función, oa una función, la visibilidad de esa variable o función se limita a la "unidad de traducción" en la que está declarada, es decir, el archivo en sí. Para las variables, esto se reduce a un tipo de "variable global visible localmente".
Ambos usos son bastante comunes en los controladores de código de nivel relativamente bajo.
El primero, y el último cuando se aplica a las variables, permiten que las funciones retengan una noción de estado entre llamadas, lo que puede ser muy útil, pero esto también puede causar todo tipo de problemas desagradables cuando el código se utiliza en cualquier contexto donde sea se usa al mismo tiempo, ya sea por múltiples hilos o por múltiples llamadores. Si no puede garantizar que un "usuario" llame estrictamente el código en secuencia, puede pasar un tipo de estructura de "contexto" que mantiene la persona que llama en cada llamada.
Este último, aplicado a las funciones, permite a un programador hacer que la función sea invisible desde el exterior del módulo, y PUEDE ser algo más rápida con algunos compiladores para ciertas arquitecturas porque el compilador sabe que no tiene que hacer que la variable / función esté disponible afuera el módulo, lo que permite que la función esté en línea, por ejemplo.
Si declara que una variable es static
, solo está visible en esa unidad de traducción (si se declara de manera global) o conserva su valor de llamada a llamada (si se declara dentro de una función).
En tu caso, supongo que es el primer caso. En ese caso, probablemente el programador no quería que la estructura fuera visible desde otros archivos.
variable de estructura
Para una variable struct como static struct S s;
, esto ha sido ampliamente discutido en: ¿Qué significa "estático"?
definición de estructura: sin efecto :
static struct S { int i; int j; };
es exactamente lo mismo que:
struct S { int i; int j; };
así que nunca lo uses. GCC 4.8 genera una advertencia si lo hace.
Esto se debe a que las definiciones de estructura no tienen almacenamiento, y no generan símbolos en los archivos de objetos como variables y funciones. Solo intente compilar y descompilar:
struct S { int i; int j; };
int i;
con:
gcc -c main.c
nm main.o
y verá que no hay un símbolo S
, pero hay un símbolo i
.
El compilador simplemente usa definiciones para calcular el desplazamiento de los campos en tiempo de compilación.
Por lo tanto, deben incluirse en los archivos de encabezado.
Lo mismo ocurre con enum
.
Definición de estructura de C ++: obsoleta en C ++ 11
C ++ 11 N3337 proyecto estándar Anexo C 7.1.1:
Cambio: en C ++, los especificadores estáticos o externos solo se pueden aplicar a nombres de objetos o funciones. El uso de estos especificadores con declaraciones de tipo es ilegal en C ++. En C, estos especificadores se ignoran cuando se usan en declaraciones de tipos.
Ver también: https://.com/a/31201984/895245