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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top