Cuándo usar extern en C++
Estoy leyendo "Think in C++" y acaba de introducir 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 resulta útil.
¿Puede alguien dar un ejemplo?
5 answers
Esto es útil cuando se tienen variables globales. Declaras la existencia de variables globales en un encabezado, de modo que cada archivo fuente que incluye el encabezado lo sepa, pero solo necesitas "definirlo" una vez en uno de tus archivos fuente.
Para aclarar, usando 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 para usarlo. Una vez que todos los archivos fuente han sido compilados, el enlazador resolverá todas las referencias de x
a la definición que encuentra en uno de los archivos fuente compilados. Para que funcione, la definición de la variable x
necesita tener lo que se llama "enlace externo", lo que básicamente significa que necesita ser declarada fuera de una función (en lo que generalmente se llama "el ámbito del archivo") y sin la palabra clave static
.
Cabecera:
#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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-17 21:24:59
Es útil cuando se comparte 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;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-02 21:32:44
Se trata del enlace .
Las respuestas anteriores proporcionaron buenas explicaciones sobre extern
.
Pero quiero añadir un punto importante.
Preguntar acerca de {[4] {} en[18]}C++ no C y no sé por qué no hay una respuesta mencionar sobre 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 vinculación error :
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í:{[12]]}
Fuente 1 :
extern const int global = 255; //a definition of global const variable in C++
Fuente 2 :
extern const int global; //declaration
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-09 09:17:06
Esto es útil cuando desea tener una variable global. Se definen las variables globales en algún archivo de origen, y se declaran extern en un archivo de encabezado para que cualquier archivo que incluye ese archivo de encabezado verá la misma variable global.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-02 21:33:37
Cuando tienes variables globales tienes que declararlas extern en cualquier unidad de traducción en la que no estén definidas o obtendrás múltiples definiciones. Por supuesto, esto debe evitarse, ya que los globales generalmente no son buenos.
Cuando escribes en C y quieres permitir que los usuarios de C++ usen tu biblioteca, declaras tus cosas en un bloque extern "C" {}
. Como C apesta, tampoco deberías necesitar esto.
Y luego están las plantillas externas, que no son parte del estándar nunca más.
Finalmente, está declarando una instanciación de plantilla que ocurre en otro lugar y desea vincularla en lugar de crear una nueva. Usted declara los externos también. Esto tiene un uso ocasional...posiblemente...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 se necesita.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-02 21:35:58