c++ - significado - variables globales extern
Cuándo usar extern en C++ (5)
Cuando tiene variables globales, tiene que declararlas externas en cualquier unidad de traducción en la que no estén definidas o obtendrá múltiples definiciones. Evidentemente, esto debe evitarse, ya que los globales en general no son buenos.
Cuando escribes en C y quieres permitir que los usuarios de C ++ utilicen tu biblioteca, declaras tus cosas en un bloque extern "C" {}
. Ya que C apesta, no deberías necesitar esto tampoco.
Y luego están las plantillas externas, que ya no forman parte del estándar.
Finalmente, está declarando una creación de instancias de plantilla que se produce en otro lugar y desea vincularla en lugar de crear una nueva. Ustedes declaran los externos también. Esto tiene un uso ocasional ... tal vez ... nunca lo he hecho.
Creo que puedo contar la cantidad de veces que he necesitado "extern" en C ++ por un lado, ya que tiendo a evitar todas las construcciones en las que es necesario.
Estoy leyendo "Think in C ++" y acaba de presentar la declaración extern
. Por ejemplo:
extern int x;
extern float y;
Creo que entiendo el significado (declaración sin definición), pero me pregunto cuándo será útil.
¿Alguien puede dar un ejemplo?
Es útil cuando compartes una variable entre unos pocos módulos. Usted lo define en un módulo, y usa extern en los otros.
Por ejemplo:
en file1.cpp:
int global_int = 1;
en file2.cpp:
extern int global_int;
//in some function
cout << "global_int = " << global_int;
Esto es útil cuando quieres tener una variable global. Usted define las variables globales en algún archivo de origen y las declara externas en un archivo de encabezado para que cualquier archivo que incluya ese archivo de encabezado vea la misma variable global.
Esto es útil cuando tienes variables globales. Usted declara la existencia de variables globales en un encabezado, de modo que cada archivo de origen que incluye el encabezado lo sepa, pero solo necesita "definirlo" una vez en uno de sus archivos de origen.
Para aclarar, utilizando extern int x;
le dice al compilador que un objeto de tipo int
llamado x
existe en algún lugar . No es el trabajo de los compiladores saber dónde existe, solo necesita saber el tipo y el nombre para saber cómo usarlo. Una vez que se hayan compilado todos los archivos de origen, el vinculador resolverá todas las referencias de x
a la definición que encuentra en uno de los archivos de origen compilados. Para que funcione, la definición de la variable x
debe tener lo que se denomina "enlace externo", lo que básicamente significa que se debe declarar fuera de una función (en lo que generalmente se denomina "alcance del archivo") y sin la palabra clave static
.
encabezamiento:
#ifndef HEADER_H
#define HEADER_H
// any source file that includes this will be able to use "global_x"
extern int global_x;
void print_global_x();
#endif
fuente 1:
#include "header.h"
// it needs to be defined somewhere
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
fuente 2:
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
Se trata de la vinculación .
Las respuestas anteriores proporcionaron buenas explicaciones sobre extern
.
Pero quiero añadir un punto importante.
Preguntas sobre extern
en C ++ no en C y no sé por qué no hay respuesta mencionando el caso cuando extern
viene con const
en C ++.
En C ++, una variable const
tiene un enlace interno por defecto (no como C).
Así que este escenario conducirá a un error de enlace :
Fuente 1:
const int global = 255; //wrong way to make a definition of global const variable in C++
Fuente 2:
extern const int global; //declaration
Tiene que ser así:
Fuente 1:
extern const int global = 255; //a definition of global const variable in C++
Fuente 2:
extern const int global; //declaration