definición de variable constante global: acceso a través de externo en c++
-
21-12-2019 - |
Pregunta
Leí algunas respuestas sobre este tema, pero todavía no estoy seguro:
En C++ se crea automáticamente una definición de variable constante global. static
.Sin embargo, puedo acceder a él desde otro archivo cpp a través de externo:
// module.cpp
const int i = 0;
y
// main.cpp
extern const int i;
int main ()
{
if (i > 10)
return 0;
else
return 1;
}
¿Por qué es esto posible (acceder a un objeto con enlace interno desde otro módulo)?Normalmente debería verme obligado a definir i
como extern const int i = 0
en module.cpp, para tener un explícitamente constante global pero no estática, ¿o?
En comparación, esto no es posible:
// module.cpp
static int i = 0;
y
// main.cpp
extern int i;
int main ()
{
i = 10; // but read-only access like (i > 10) would be possible!
return 0;
}
Así es la respuesta que:sí, puede acceder a objetos vinculados internos desde otros módulos, pero solo para lectura (siempre con const).
Editar:
Lo siento, pero cometí un error:en mi código original acabo de probar una expresión sin efecto (en ambos ejemplos):
extern const int i; // or extern int i for second example
int main ()
{
i>10;
return 0;
}
Pensé que se comporta igual, como si el flujo del programa o los datos dependieran de esta expresión, ¡pero en realidad no es así!¡El compilador parece simplemente recortar esta expresión sin efecto, para que el vinculador no la vea!Entonces todo está bien:en el primer ejemplo i
debe ser efectivamente definido extern const int i = 0
en module.cpp, y en el segundo ejemplo i
no se puede acceder en absoluto (a menos que esté en una expresión sin efecto).El compilador es VC++2010.
Editar2:
Sin embargo, ahora no entiendo por qué esto es posible:
// module.cpp
extern const int i = 0;
y
// main.cpp
int i = 99;
int main ()
{
bool b = i>10;
return 0;
}
i
tener ambos enlaces externos.Pero ningún error.Cuando en module.cpp defino int i = 0
, luego error (múltiples símbolos).¿Por qué?
Solución
En cuanto a mí parece un error de compilador.La variable constante que no está definida, solo se declara en Main.CPP.En cuanto a la variable i en Module.CPP, entonces tiene un enlace interno y no debe ser accesible fuera del módulo.
En relación con su adición a la publicación original, el compilador no tiene nada común con esta situación.Es un enlazador que comprueba si hay símbolos externos duplicados.Creo que decidió que si una variable tiene calificador constante y otra no lo tiene, entonces hay dos variables diferentes.Creo que es la implementación definida si el enlazador emitirá un error o no.Además, puede tener algunas opciones que podrían controlar el comportamiento del enlazador en tales situaciones.