definição de variável const global - acesso através de externo em c++
-
21-12-2019 - |
Pergunta
Li algumas respostas sobre este tópico, mas ainda não tenho certeza:
Em C++, uma definição de variável const global é automaticamente static
.No entanto, posso acessá-lo de outro arquivo cpp através de externo:
// module.cpp
const int i = 0;
e
// main.cpp
extern const int i;
int main ()
{
if (i > 10)
return 0;
else
return 1;
}
Por que isso é possível (acessar um objeto com ligação interna de outro módulo)?Normalmente eu deveria ser forçado a definir i
como extern const int i = 0
em module.cpp, para ter um explicitamente const global, mas não estático, ou?
Em comparação, isso não é possível:
// module.cpp
static int i = 0;
e
// main.cpp
extern int i;
int main ()
{
i = 10; // but read-only access like (i > 10) would be possible!
return 0;
}
Então é a resposta que:sim, você pode acessar objetos vinculados internos de outros módulos, mas apenas para leitura (sempre com const)?
Editar:
Desculpe, mas cometi um erro:no meu código original, apenas tentei uma expressão sem efeito (em ambos os exemplos):
extern const int i; // or extern int i for second example
int main ()
{
i>10;
return 0;
}
Pensei que se comportasse da mesma forma, como se o fluxo ou os dados do programa dependessem desta expressão, mas na verdade não é assim!O compilador parece apenas cortar essa expressão sem efeito, para que o vinculador não a veja!Então está tudo bem:no primeiro exemplo i
deve ser de fato definido extern const int i = 0
em module.cpp, e no segundo exemplo i
não pode ser acessado de forma alguma (a menos que em expressão sem efeito).O compilador é VC++2010.
Editar2:
No entanto, agora não entendo por que isso é possível:
// module.cpp
extern const int i = 0;
e
// main.cpp
int i = 99;
int main ()
{
bool b = i>10;
return 0;
}
i
tem ambos ligação externa.Mas nenhum erro.Quando em module.cpp eu defino int i = 0
, e, em seguida, erro (vários símbolos).Por que?
Solução
Quanto a mim, parece um bug do compilador.A variável constante i não está definida. Ela é declarada apenas em main.cpp.Já a variável i em module.cpp então ela possui ligação interna e não deve ser acessível fora do módulo.
Em relação à sua adição à postagem original, o compilador não tem nada em comum com essa situação.É o vinculador que verifica se há símbolos externos duplicados.Acho que foi decidido que se uma variável tem qualificador const e outra não, então existem duas variáveis diferentes.Acho que é a implementação definida se o vinculador emitirá um erro ou não.Além disso, pode ter algumas opções que podem controlar o comportamento do vinculador em tais situações.