2010-03-30 27 views
7

En el proceso de cambiar algún código, he derramado algunas funciones en varios archivos. Tengo los archivos controls.cpp y display.cpp y me gustaría tener acceso al mismo conjunto de variables en ambos archivos. No me importa dónde se inicializan o declaran, siempre que las funciones en ambos archivos puedan usarlos.Utilizando la misma variable en varios archivos en C++

Esto no era un problema cuando las funciones estaban en el mismo archivo, pero ahora parece casi imposible después de una hora de búsqueda de Google y probar varias cosas.

+7

Esto es, por supuesto, una práctica muy pobre: ​​debería rediseñar su código en lugar de hacerlo. –

+1

este es el propósito por el cual la palabra clave 'extern' está presente en c – Vijay

+1

Esto, por supuesto, plantea la pregunta de por qué tiene variables globales en absoluto. – sbi

Respuesta

17

Definir la variable en un archivo como:

type var_name; 

y declararlo global en el otro archivo como:

extern type var_name; 
+4

Mejor aún: ponga 'extern type var_name' en un encabezado e inclúyalo en todos los demás archivos en lugar de poner la declaración en ellos manualmente. – sbi

6

uso de esas variables como extern es decir

extern int i; 

en otro archivo declaran mismo que la variable global normalidad ...

int i;//global 
-1

Todas las declaraciones que desea visible en múltiples unidades de compilación (archivos .cpp), debe entrar en un fichero de cabecera que incluya en todos los lugares que necesitan utilizar la variable, tipo, clase, etc.

Esto es mucho mejor que extern, lo que esencialmente oculta su intención de compartir la declaración.

+1

No puedes hacer eso. Tendrá que ser tanto extern * como * en el archivo de encabezado o de lo contrario recibirá errores de redeclaración. –

+1

La redeclaración y "extern" son cuestiones totalmente ortogonales. Debería haber mencionado que cada cabecera se escribe tiene que tener "incluyen guardias" que rodean su contenido: #ifndef UNIQUE_NAME_OF_HEADER_FILE_HPP #define UNIQUE_NAME_OF_HEADER_FILE_HPP ... declaraciones ... #endif o si su compilador soporta #pragma una vez – simong

4

Crear dos nuevos archivos:

  1. algo así como Globals.h y declarar todas las variables como: extern type name;
    • por cierto recuerda incluir los guardias.
  2. Algo así como Globals.cpp y declarar las variables como: type name;

A continuación, agregue #include "Globals.h" en la parte superior:

  • Globals.cpp
  • controls.cpp
  • display.cpp

Es posible que desee algunas funciones para inicializarlos.

+0

¿Se pueden inicializar en Globals.cpp? – Sam152

+0

@ Sam152: Sí, sugiero crear una función que viva en 'Globals.cpp' y declararla en' Globals.h' – quamrana

+0

@ Sam152 Consulte mi respuesta a continuación para ver un truco que le permite declarar e inicializar todas las variables en el .h archivo. – BrainSlugs83

2

Esencialmente, todo lo que tiene que hacer es declarar la variable una vez en un archivo de código y declararlo en los demás como extern (asegurándose de NO inicializarlo cuando lo declara extern, o algunos compiladores ignorarán la palabra clave extern , que le da errores de compilación.)

La forma más sencilla de hacer esto es utilizar una macro en un archivo de cabecera, como por ejemplo:

#pragma once 

#ifdef __MAIN__ 
    #define __EXTERN(type, name, value)  type name = value 
#else 
    #define __EXTERN(type, name, value)  extern type name; 
#endif 

y luego declarar las variables en ese mismo fichero de cabecera, como por ejemplo:

__EXTERN(volatile int, MyVolatileInteger, 0); 

de cualquier archivo UNO en el proyecto, incluir el archivo de cabecera, como por ejemplo:

#define __MAIN__ 
#include "Globals.h" 

de todos los demás , simplemente inclúyalo normalmente, como tal:

#include "Globals.h" 

Presto, listo. Las variables solo se declararon una vez y se inicializaron en línea. Esto es muy fácil de mantener, y le ahorra la molestia de tener que declarar todo dos veces.

Cuestiones relacionadas