Estoy leyendo "Think in C ++" y acaba de presentar la externdeclaración. 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?
Estoy leyendo "Think in C ++" y acaba de presentar la externdeclaración. 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?
Respuestas:
Esto resulta útil cuando tiene variables globales. Usted declara la existencia de variables globales en un encabezado, de modo que cada archivo fuente que incluye el encabezado lo sepa, pero solo necesita "definirlo" una vez en uno de sus archivos fuente.
Para aclarar, usar extern int x;le dice al compilador que un objeto de tipo intllamado xexiste en alguna parte . 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 xa la definición que encuentra en uno de los archivos de origen compilados. Para que funcione, la definición de la xvariable debe tener lo que se llama "enlace externo", lo que básicamente significa que debe declararse fuera de una función (en lo que generalmente se llama "el alcance del archivo") y sin la staticpalabra clave.
#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
#include "header.h"
// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
Es útil cuando comparte una variable entre unos pocos módulos. 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;
global_intestá en el espacio de nombres global, si tuviera que usarlo en file2.cpp en alguna sección de espacio de nombres tendría que determinarlo correctamente? es decirnamespace XYZ{ void foo(){ ::global_int++ } };
abc.h, hay una buena probabilidad de que se defina en abc.cpp. Un buen IDE siempre ayudará, pero un código bien organizado siempre es una mejor solución.
externen file2.cpp, aún puede acceder a global_intafter include. ¿Por qué necesito tenerlo?
Se trata de la vinculación .
Las respuestas anteriores proporcionaron buenas explicaciones sobre extern.
Pero quiero agregar un punto importante.
Pregunta externen C ++ no en C y no sé por qué no hay una respuesta que mencione sobre el caso cuando externviene con constC ++.
En C ++, una constvariable tiene un enlace interno por defecto (no como C).
Entonces 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
externdefinición? Puede hacerlo imprimiendo el valor de globalen la fuente 2.
externse omite en const int global = 255;.
Esto es útil cuando desea tener una variable global. Usted define las variables globales en algún archivo fuente y las declara externas en un archivo de encabezado para que cualquier archivo que incluya ese archivo de encabezado vea la misma variable global.
externen varias ocasiones. Las herramientas de Microsoft produjeron un error de enlace para los símbolos faltantes cuando solo se definieron las tablas en otro archivo fuente. El problema era que la tabla eraconsty el compilador de C ++ lo promovióstaticen la unidad de traducción. Ver, por ejemplo,ariatab.cppykalynatab.cpp.