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?

Author: sdgfsdh, 2012-05-03

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;
}
 387
Author: dreamlax,
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;
 114
Author: MByD,
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
 39
Author: Nik,
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.

 11
Author: Marlon,
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.

 -2
Author: Crazy Eddie,
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