22 votos

C - envolver globales en una estructura?

Un firmware estilo cuestión relativa a C.

Tengo algo de código heredado estoy adecentando. Una de las desagradables características es que las variables globales que se dispersa a través de los archivos de origen. Puedo hacer un par de ellos locales, lo cual está bien. Sin embargo, ¿cómo lidiar con el resto. Estoy a favor de la creación de una estructura y ponerlos dentro de ella.

Sé que no es teóricamente otro nivel de direccionamiento indirecto al acceder a ellas, pero de un estilo POV es esto mejor o peor que la de ponerlos en los archivos globales.c y/o globales.h?

24voto

Neil Foley Puntos 1313

Es bien conocida la mala práctica de tener un "super encabezado de archivo" como "globals.h" o "incluye.h", etc, porque además de las variables globales de ser mal en el primer lugar, esto también crea un estrecho vínculo de dependencia entre cada sola, no relacionadas archivo en el proyecto.

Digamos que usted tiene un PWM controlador y una interfaz RS-232 depuración del módulo de impresión. Usted desea tomar el RS-232 depuración del módulo de impresión y volver a utilizarla en otro proyecto. De repente se encuentra con la necesidad de algunos PWM.h que no tiene una idea acerca de lo que es o donde la necesidad viene. Estarás preguntando por qué en la tierra que necesita un PWM controlador para ejecutar la interfaz RS-232.

Y, a continuación, aún no hemos considerado re-entrancy de este sucio global de la estructura. No permite hacer eso.


La manera correcta para desenredar global espaguetis preferiría ser algo como esto:

  • Es la variable que se utiliza en el primer lugar? Si no, quitar. (Esto es bastante común)
  • Puede que la variable sea trasladado a un ámbito local dentro de una función?
  • Puede que la variable se trasladó al local .c ámbito de los archivos por lo que es static? Se puede reducir el acceso a él desde fuera de la .c archivo por la aplicación de setter/getter funciones?

Si todo lo anterior falla, entonces la variable que se encuentre a su alrededor debe ser una memoria de hardware asignado registrar parte de un registro de mapa, o es algo de tiempo real crítico sucio revisión que se ha añadido durante el mantenimiento.

14voto

Rolando S. Puntos 41

Iba a trabajar para definir una estructura que se crea la instancia como la única variable global. Accesos en el formulario de 'the_global.the_var' no agregar sobrecarga de tiempo de ejecución y puede aclarar que es de hecho un mundial. Como https://stackoverflow.com/questions/2868651/including-c-header-file-with-lots-of-global-variables menciona, le ahorra a partir de distintas declaraciones y definiciones.

Personalmente no me molestan en hacer una estructura, prefiriendo tipo globales en el encabezado de los archivos en los que siento que lógicamente pertenecen y el uso de un prefijo común para cada archivo de encabezado. Ejemplo: Archivo de calcular.h declarar "extern int calc_result;" y calcular.c la definición de "int calc_result;"

Otras variables conseguir lejos con archivos locales, es decir, "static int resultado;" en el .c archivo.

Puesto que usted tiene el código de la herencia que creo que no trabajo mucho con el más allá de la limpieza para arriba, yo diría que la solución más rápida que hace que para una estructura clara es la mejor.

13voto

user235111 Puntos 20

Si usted no puede deshacerse de la globals, yo diría que usted debe empacar sólo ellos juntos en una estructura si en realidad están relacionados. Si no, entonces me gustaría mantenerlos separados o en pequeñas estructuras.

Además, no me gustaría que una globales.h archivo. Mantenerlos en la parte superior del archivo de código fuente donde la mayoría pertenece. De esta manera, cuando la navegación a través del código, probabilidades de permanecer en el lugar donde estaban o ir al lugar que probablemente quería ir.

10voto

Spike Puntos 304

En realidad, no es mejor, la única ventaja es que usted "sabe" que son globales. Así que tiene todas globales en un solo lugar, pero todavía están esparcidos alrededor.

C

Para cada uno de los mundiales:

  • Encontrar el archivo inicial, donde es creado o usado.
  • Hacer estático en ese archivo
  • En caso de que el mundial se utiliza en muchos lugares, usar externamente a partir de otros archivos (usando el extern de palabras clave).
  • Pero la mejor manera es pasar la variable a los lugares donde se necesita.

C++

Para cada uno de los mundiales:

  • Encontrar el lugar inicial donde se crea o utiliza.
  • Encontrar la clase que mejor se adapte a.
  • Mover a esa clase (como de campo, conectado a un objeto).
  • Ahora crear un Get/Set método (funciones). Preferentemente, el método de juego es protegido o privado).
  • En lugar de los métodos Get y Set también pueden pasar a través de los argumentos del método.
  • El uso de métodos Get/Set de otras clases.
  • En algunos casos, usted va a ver un campo de una clase, por ejemplo cuando no puede ser sólo 'uno'. En este caso, utilizar el patrón de diseño Singleton. (Cuidado con esto, ya que siendo una especie de mundial, así que asegúrese de que en el futuro va a nunca hacer más de ellos; de otra manera es un espacio global en el disfraz).

6voto

Marten Bauer Puntos 293

Las grandes ventajas de poner las variables globales en una estructura son:

  1. Es claro que cuando se utiliza una globales frente a una variable local.
  2. Es imposible máscara por accidente una variable global con una variable local con el mismo nombre.

Menor avantages son :

  1. Es más fácil de depurar desborda en una matriz global o búfer de memoria porque la memoria de diseño que se puede deducir de la estructura.
  2. La estructura global puede ser muy simplemente guardan en / cargado de almacenamiento no volátil.

Uso sensato de las variables globales pueden reducir la pila de requisitos, pero aumenta el riesgo de error en caso de que su uso no está bien documentado y las reglas respetadas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X