No Exercício 23, Capítulo 3 de Ponteiros em C :
Suponha que você queira escrever duas funções, x
e y
, no mesmo arquivo de origem, que usam as seguintes variáveis:
Nome | Tipo | Classe de armazenamento | Gostar | Escopo | Inicializado para |
---|---|---|---|---|---|
um | Inteiro | estático | externo | acessível a x, não a y | 1 |
b | Caracteres | estático | nenhum | acessível a x e y | 2 |
Mas eu acho que é impossível escrever tal a
e b
. Alguém pode explicar isso?
Primeiro, o exercício é falho porque o escopo é sobre visibilidade de um nome, não acessibilidade de um objeto. Visibilidade significa que um nome pode ser usado no código-fonte. Acessibilidade significa que uma memória de objeto pode ser lida ou escrita.
Dito isto, a
a
variável do exercício é simples:Aqui
a
está umint
, sua classe de armazenamento é estática, sua vinculação é externa, é visível emx
, não é visível emy
, e é inicializado como 1.b
é um problema. O exercício diz queb
não deve haver ligação. C 2024 6.2.2 nos diz:Vamos considerar cada um deles. Para o primeiro, há identificadores para coisas que não sejam objetos ou funções. No entanto, o exercício diz que a variável tem classe de armazenamento estática, mas classe de armazenamento é uma propriedade de objetos, conforme C 2024 6.2.4. Portanto, uma variável não pode ter um identificador sem vinculação e um objeto com duração de armazenamento estático.
Para o segundo e o terceiro, se um identificador for um parâmetro de função ou um identificador de escopo de bloco, então seu escopo é limitado ao seu bloco associado, que está dentro de uma função. Ele não pode ser visível em duas funções
x
ey
em código C comum.Uma maneira de contornar isso é que algumas implementações C têm extensões para permitir declarar funções dentro de funções. Nesse caso,
b
poderia ser declarado no escopo do bloco dentro de uma funçãox
e também ser visível dentro de uma funçãoy
declarada dentro dex
. No entanto, duvido que essa fosse a intenção do exercício.Mais provavelmente, é um erro no exercício, e o autor estava pensando em uma declaração para
b
que, na verdade, desse a ele uma ligação interna, não nenhuma ligação. Isso tem uma solução simples:No entanto, retornando à descrição falha de escopo no exercício, há uma solução para tornar
b
acessível , não visível, para ambosx
ey
. A funçãoy
pode acessar um objetob
sem usar seu nome usando um ponteiro.É possível - a visibilidade do objeto também depende do escopo, mas apenas da vinculação e da duração do armazenamento.