Por qué no se necesita decorar un "Const Char *" con "Extern" al compartirlo, cruce múltiples archivos
Pregunta
Mientras lee los libros de C ++, aprendí que para compartir un Const Variable / Object Cross Multips Files, debemos definir la variable Const una vez en uno de los archivos, y declararlo en cada archivo de origen donde se usa.Por ejemplo,
en file1.cpp, definimos una variable CONT INT a nivel mundial como
extern const int ca = 100;
en file2.cpp donde lo usamos, declaramos esta variable como
extern const int ca;
La convención anterior tiene perfecto sentido para mí.Sin embargo, al llegar a un indicador Const Char, no necesitamos definirlo usando lo externo, y se puede compartir varios archivos de varios archivos.¿Por qué sucede tal cosa?Por ejemplo,
en File1.CPP, definimos una variable Const Char Pointer Globally como
const char *cstr = "hello";
en file2.cpp donde lo usamos, declaramos esta variable como
extern const char *cstr;
Para hacer mi pregunta más específica, ¿por qué CSTR se puede usar en File2.CPP a pesar de que no está decorado con "Extern" en File1.CPP?
Muchas gracias
Solución
El problema es uno de enlace.Cuando definas una variable en alcance del espacio de nombres, y no hay declaración previa que establece enlace, el enlace externo si el objeto no es Const, interno si lo es.Así que cuando escribes:
int const ca = 100;
En un archivo de origen, el enlace será interno y la entidad
(la variable) ca
se refiere a será exclusivo de la traducción
unidad.Si hubieras escrito:
int ca = 100;
El enlace sería externo, por lo que una
extern int ca;
en otra unidad de traducción se referiría a la misma variable.
y por supuesto, cuando escribes:
char const* cstr = "hello";
Usted está definiendo un puntero, que no es const (aunque puntos a const).
Por supuesto, normalmente, declararía las variables en un encabezado,
con extern
, por lo que habría una declaración anterior cuando
Defina las variables, y es la primera declaración que
Establece el vínculo.
Otros consejos
lo externo se usa para hacerlo explícito que la declaración "Extern Const Char * CSTR" "Es una declaración y no una definición, CSTR se define en otro lugar.Si hiciste "Const Char * CSTR"; "El compilador interpretaría eso como una definición y terminaría con 2 variables CSTR.
Si se aplica alternado en "Const Char * cstr=" hola ";"Supongo que el compilador lo ignora porque la inicialización significa que en realidad está definiendo la variable.