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é?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top