int;
char fn (int itg, charch);
es = 5;
char fn (int itg, charch)
char var = 'o';
if (itg == 1 && ch == 'a')
var = 'z';
return var;
La primera línea es una declaración variable. La segunda línea habría sido una firma de función si nunca hubiera terminado con un punto y coma seguido de un cuerpo de función. Esta segunda línea que termina con un punto y coma es un prototipo de funciones. También es una declaración de función. La tercera línea asigna valor a la variable entera: esta es una inicialización variable, pero aún se puede ver aproximadamente como una definición variable. El resto del código es una definición de función. Comienza con la firma de la función, seguido por el cuerpo de la función.
Hay un matiz en C ++ cuando se refiere a la declaración y la definición. La siguiente declaración es una declaración variable:
int it = 5;
Una declaración de variable completa como esta, donde se introduce la variable y luego se le asigna un valor, sigue siendo una declaración variable. Por lo tanto, una declaración variable puede ser introducir la variable sola o la introducción con la definición.
El siguiente código (copiado de arriba) es una declaración de función:
char fn (int itg, charch)
char var = 'o';
if (itg == 1 && ch == 'a')
var = 'z';
return var;
Una declaración de función completa como esta, donde su firma introduce la función y luego es seguida por el cuerpo de la función, sigue siendo una declaración de función. Por lo tanto, una declaración de función puede ser solo el prototipo de función solo, o puede ser la firma de la función junto con el cuerpo de la función.
Entonces, una declaración puede ser con o sin una definición. Una definición es como una subparte de una declaración. Con la variable, asignar un valor por primera vez es en realidad la inicialización y no está realmente definida. Cuando una variable se declara por primera vez sin inicialización, su ubicación en la memoria ya está proporcionada, pero está vacía. El ajuste en un valor en la ubicación es una inicialización, que está completando la definición.
Tradicionalmente, una aplicación C ++ simple tiene tres archivos. Tiene un archivo principal que se puede llamar el primer archivo. Tiene un segundo archivo y un archivo de encabezado. El uso del especificador externo puede reducir el número de archivos a dos (de tres). Este artículo explica el uso del especificador externo con variables y funciones para evitar el archivo de encabezado. Nota: En el vocabulario de C ++, estos dos archivos se llaman unidades de traducción.
Contenido del artículo
Archivo de encabezado sin extern
Tradicionalmente, una aplicación C ++ simple tiene tres archivos: el archivo principal con la función Main () que se puede llamar el primer archivo, un segundo archivo y un archivo de encabezado. El archivo de encabezado debe tener las declaraciones de variables y funciones sin sus definiciones. Las definiciones de las declaraciones de encabezado deben estar en el segundo archivo. En la parte superior del primer archivo, tiene que haber,
#Include "Cabeza.S.S"
Donde la cabeza.HH es el nombre del archivo de encabezado y reside en el directorio de usuarios. La directiva incluir no termina con un punto y coma. En esta situación, las declaraciones variables sin definiciones, y los prototipos de funciones sin definiciones de función en el archivo de encabezado no deben ser precedidas por el especificador externo. Y la aplicación debería funcionar.
Ilustración
La variable y la función anteriores se utilizan para la ilustración aquí.
Escriba el siguiente código en un editor de texto y guárdelo en el directorio de usuarios de casas, con el nombre, cabeza.S.S :
int it = 5;
char fn (int itg, charch);
Solo hay dos declaraciones en el encabezado. Siguiente escriba lo siguiente en un documento sin título del editor de texto y guarda en el directorio de usuarios de casos, con el nombre, segundo.CPP:
char fn (int itg, charch)
char var = 'o';
if (itg == 1 && ch == 'a')
var = 'z';
return var;
Y luego, escriba el siguiente código en otro documento sin título del editor de texto y guárdelo en el directorio de usuarios de casas, con el nombre, primero.CPP:
#Include "Cabeza.S.S"
#incluir
usando el espacio de nombres STD;
int main ()
cout << it << endl;
cout << fn(1, 'a') << endl;
regresar 0;
Compile la aplicación con el siguiente comando terminal:
G ++ primero.CPP segundo.CPP -O completo.exe
Ejecutar la aplicación con,
./completo.exe
La salida es:
5
z
Desafortunadamente, el archivo de encabezado no permite una declaración simple de una variable (E.gramo., it) sin inicialización. Sin embargo, este problema se puede resolver como se muestra a continuación.
externo sin archivo de encabezado
El archivo de encabezado se puede eliminar si el especificador externo se usa adecuadamente. Habrá una declaración para la variable y la función en esta situación, cada una sin definición en el primer archivo (principal). Cada uno será precedido por un external.
Ilustración
Escriba el siguiente código en un editor de texto y guárdelo en el directorio de usuario de usuario, con el nombre, primero.CPP:
#incluir
usando el espacio de nombres STD;
externo int it;
externo char fn (int itg, charch);
int main ()
cout << it << endl;
cout << fn(1, 'a') << endl;
regresar 0;
A continuación, escriba lo siguiente en un documento sin título del editor de texto y guarde en el directorio de usuarios de casos con el nombre, segundo.CPP:
int it = 5;
char fn (int itg, charch)
char var = 'o';
if (itg == 1 && ch == 'a')
var = 'z';
return var;
La definición de la variable y la función se han llevado a cabo en el segundo archivo. En el primer archivo aquí, han sido declarados sin definición. No se ha incluido ningún encabezado en esta nueva aplicación. Solo hay dos archivos involucrados. Tenga en cuenta que la variable se ha declarado completamente en el segundo archivo pero sin la palabra external. Incluso la función también se ha declarado completamente sin la palabra externa. Sin embargo, la palabra "extern" debe preceder a las declaraciones parciales en el primer archivo.
Compile la aplicación con el siguiente comando terminal:
G ++ primero.CPP segundo.CPP -O completo.exe
Ejecute la aplicación con,
./completo.exe
La salida es:
5
z
Igual que antes, pero sin ningún archivo de encabezado.
Entonces, el especificador externo vincula las declaraciones entre dos archivos. Un archivo debe hacer una declaración sin definición y con extern. El otro archivo debe hacer una definición, que sería una declaración completa, pero sin un extern.
Archivo de encabezado y extern
La aplicación anterior tuvo el problema de que la variable debía declararse completamente en el archivo de encabezado. Para tener la declaración de una variable en un archivo de encabezado sin la definición, la variable debe ser precedida por un extern. Entonces, si hay,
externo int it;
En el archivo de encabezado, habría
int it = 5;
en el segundo archivo, y todavía habría
#Include "Cabeza.S.S"
En la parte superior del primer archivo (archivo principal).
Constante y externo
En circunstancias normales, se debe inicializar una constante. Por ejemplo,
const char ch = 'e';
está permitido y
const char ch;
No se permite.
Sin embargo, con el especificador externo, se puede declarar una constante sin inicialización en el primer y segundo archivo. Entonces, si en el primer archivo, hay
EXTER CONST CHAR CH;
En el segundo archivo, habrá
char ch = 'e';
Sin const en el segundo archivo. CH en ambos archivos es la misma entidad.
Reemplace el primero.Archivo CPP con el siguiente contenido y guardar:
#incluir
usando el espacio de nombres STD;
EXTER CONST CHAR CH;
int main ()
cout << ch << endl;
regresar 0;
Reemplazar el segundo.Archivo CPP con el siguiente contenido y guardar:
char ch = 'e';
Compile la aplicación con el siguiente comando terminal:
G ++ primero.CPP segundo.CPP -O completo.exe
Ejecute la aplicación con,
./completo.exe
La salida debe ser, e.
externo y estático
Los especificadores de clase de almacenamiento en C ++ son estáticos, hilt_local, extern, mutables. No más de uno de estos se puede usar en una declaración dada. Sin embargo, en unos pocos casos, Tread_local y estático puede aparecer frente a una declaración de entidad, o Thread_local y extern pueden aparecer frente a una declaración de entidad. Entonces, extern y estática nunca pueden estar presentes como especificadores para una declaración.
Conclusión
El especificador externo vincula dos declaraciones de la misma entidad, que se encuentran en dos archivos diferentes. La declaración que tiene el especificador externo no debe inicializarse o definirse. La declaración en el otro archivo que no tiene el especificador externo debe inicializarse o definirse. Este esquema se aplica a variables y funciones. Elimina la necesidad de un archivo de encabezado para las variables y funciones de interés. Permite que se declare una constante sin inicialización en un archivo y en el otro archivo. Si el programador quiere un archivo de encabezado, entonces para tener una variable en el archivo de encabezado, sin inicialización, el programador debe usar extern para la variable en el archivo de encabezado.