Em que escopo é colocado um identificador de membro struct?
A especificação C diz
Existem quatro tipos de escopos: função, arquivo, bloco e protótipo de funçã
Agora se eu fizer o seguinte fora de qualquer função
struct A {
int x;
};
Meu entendimento é que o identificadorx
é visível no escopo do arquivo. E que usamos uma sintaxe de namespace para acessar o membro, como a especificação diz
cada estrutura ou união possui um espaço de nome separado para seus membros (sem ambiguidade pelo tipo da expressão usada para acessar o membro por meio do operador. ou ->)
Vamos deixar isso mais claro adicionando uma função
struct A {
int x;
};
void f(void) {
int i;
}
Em seguida, os identificadores, escopos e espaços para nome que participam na representação deste programa são (N / A é "não aplicável"):
file scope
==========================================
Ordinary | Members A | Tags | Labels
------------------------------------------
f | x | A | N/A
| | |
function scope of f
=========================================
Ordinary | Members ? | Tags | Labels
-----------------------------------------
N/A | N/A | N/A |
| | |
block scope #1
=========================================
Ordinary | Members ? | Tags | Labels
-----------------------------------------
i | | | N/A
| | |
E a hierarquia do escopo é "escopo do bloco nº 1" -> "escopo da função de f" -> "escopo do arquivo"
Certa vez conversei com um escritor de compilador C e ele disse quex
não está em nenhum escopo. Alguém pode explicar como isso funcionaria? Como podemos nos referir ax
de alguma forma? Cotação adicional (enfatize a minha):
Um identificador pode denotar um objeto; uma função; uma tag ouum membro de uma estrutura, união ou enumeração; um nome typedef; um nome de etiqueta; um nome de macro; ou um parâmetro de macro.
O mesmo identificador pode indicar diferentes entidades em diferentes pontos do program
Para cada entidade diferente que um identificador designa, o identificador é visível (ou seja, pode ser usado) apenas dentro de uma região do texto do programa chamada escop
Se dissermos que um membro de uma estrutura não tem escopo, ele não é visível e, portanto, não pode ser usado. Mas obviamente, nóspod use membros de estrutura. Estou faltando alguma coisa?