Nenhuma binding no escopo do bloco?

Todas as variables ​​declaradas em um bloco têm ‘sem binding‘?

Por exemplo:

1:

Se eu declarar uma variável estática:

void foo() { static int i; } 

Teria uma binding interna ou nenhuma binding? Se não há binding, então por que torná-lo estático?

2:

O que acontece se eu usar externamente?

 /*global scope*/ static int i; void foo() { extern int i; } 

Nesse caso, qual será o elo de i ?

De fato, ‘sem binding’ no escopo da function.

O objective é o gerenciamento vitalício : a estática tem a vida útil de uma estática global, enquanto tem a visibilidade (escopo) de um local.

Nota

Em C ++ você também pode declarar statics (‘globals’) sem linkagem colocando-os dentro de um namespace anônimo. Esse truque é usado comumente em bibliotecas somente de header:

 namespace /*anon*/ { void foo() {} // only in this translation unit int answer = 42; // this too } 

O que acontece se eu usar extern ?

Se você usar extern, a declaração é apenas uma declaração extern (nada é definido ). Como tal, normalmente seria esperado a binding externa por definição – sendo definida em outra unidade de tradução. (Por isso, age da mesma forma que quando foi declarado no escopo global). Isso é semelhante às declarações de function local:

 int main() { void exit(int); // equivalent to non-local declaration } 

Note que, no seu 2. exemplo, a variável i já foi declarada static e, portanto, não obterá binding externa. Eu posso ser declarado em outra unidade de tradução sem conflitos de linker, no entanto.

  1. “Será que teria binding interna ou nenhuma binding? Se não há binding, então por que torná-lo estático?” – não teria binding. static especifica a duração do armazenamento estático.

  2. “O que acontece se eu uso externamente?” Será uma declaração de um nome com binding externa e, como não há nenhum no escopo global, o programa relatará erros de binding. Edit: Uma vez que há uma declaração static anterior visível no escopo, o padrão diz que o nome “recebe a binding da declaração anterior” 3.5 / 6, então foo() dentro foo() terá binding interna.