2010-04-06 12 views
8

J'ai un problème avec les mots-clés typedef en langage C.Grammaire et syntaxe de typedef en langage C

Dans mon programme, j'utilise les codes suivants:

typedef int* a[10]; 

int main(){ 
int a[10]; 
} 

ils fonctionnent bien. Mais pourquoi il n'y a pas de conflits entre une variable et un type partageant le même nom?

Cordialement.

+0

Cool question - Je n'ai jamais vraiment considéré cela. Le type que vous définissez est sacrément étrange, j'espère que c'est seulement à des fins de démonstration :-) –

+0

Vous avez raison, je ne veux pas que mon code soit aussi difficile à lire qu'un puzzle. :-) –

+0

Wow, GCC est même d'accord avec "a;" (Tant que c'est dans le principal, pas global) –

Répondre

6

Voir msdn C language reference:

Typedef noms partagent l'espace de noms avec des identificateurs ordinaires (voir Name Spaces pour plus d'informations). Par conséquent, un programme peut avoir un nom de typedef et un identificateur de portée locale du même nom.

+1

Citation curieuse. En le lisant rapidement, on se sent comme un oxymore. S'ils partagent un espace de noms, comment pourraient-ils avoir le même nom? Est-ce dû au * local-scope *? –

+0

Hmm ... le lien "Name Spaces" que vous pointez indique: "Les noms de typedef ne peuvent pas être utilisés comme des identifiants dans la même portée." –

+3

@Eli: '{int x; {float x;}} ' – sbi

6

La norme de C dit (section 6.2.1 - Scopes d'identificateurs):

Un identificateur peut désigner un objet; une fonction ; une étiquette ou un membre d'une structure, union ou énumération ; un nom de type typedef ; un nom d'étiquette; une macro nom; ou un paramètre macro. Le même identificateur peut désigner différentes entités à différents points du programme .

K & R2 dire (A.11.1 - Portée lexicales)

Identifiers tomber dans plusieurs espaces de noms qui ne gênent pas l'un une autre; le même identificateur peut être utilisé à différentes fins, même en de même portée, si les utilisations sont en espaces de noms différents. Ces classes sont: objets, fonctions, typedef noms et constantes enum; Étiquettes; étiquettes de structures ou unions, et énumérations; et des membres de chaque structure ou union individuellement.

Je dois admettre que cela me rend confus. En lisant la deuxième citation, il apparaît que les noms de variables et typedef -ed types devraient s'affronter.

+0

Mais je ne suis toujours pas très clair comment peut "désigner" différentes entités coexistent dans les codes précédents. Pourriez-vous me donner d'autres explications, s'il vous plaît? Merci. –

+1

@Neil: Je lis la ponctuation différemment. On dirait que les objets, les fonctions, les noms de typedef et les constantes enum sont une classe. Les étiquettes suivantes (après un point-virgule), les étiquettes suivantes, etc. –

3

Variables et typedefs occupent le même espace de noms , et peut pas noms de partage avec d'autres identifiants dans exactement la même portée.

Cependant, votre deuxième a se trouve à l'intérieur de main et des règles d'étendue s'appliquent: la seconde a remplace la première.

Vous pouvez faire la même chose avec des variables tout simplement:

int a; 

int main() { 
    int a; 
} 

Vous remarquerez que si vous déplacez la déclaration variable en dehors principale, le programme ne sera pas compilé.