2010-04-06 20 views
8

Mam problem ze słowami kluczowymi typedef w języku C.Gramatyka i składnia typedef w języku C

W moim programie używam następujące kody:

typedef int* a[10]; 

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

pracują dobrze. Ale dlaczego nie ma konfliktów pomiędzy zmienną a typem dzielącym tę samą nazwę?

Pozdrawiam.

+0

Fajne pytanie - nigdy tak naprawdę nie zastanawiałem się nad tym. Zdefiniowany przez ciebie typ jest jednak cholernie dziwny, mam nadzieję, że jest to tylko do celów demonstracyjnych :-) –

+0

Masz rację, nie chcę, aby mój kod był tak trudny do odczytania, jak puzzle. :-) –

+0

Wow, GCC jest nawet w porządku z "a;" (o ile jest w głównym, nie globalnym) –

Odpowiedz

6

Zobacz msdn C language reference:

typedef nazw dzielić przestrzeń nazw ze zwykłych identyfikatorów (patrz Name Spaces uzyskać więcej informacji). Dlatego program może mieć nazwę typu i identyfikator zakresu lokalnego o tej samej nazwie.

+1

Ciekawy cytat. Czytanie go szybko wydaje mi się oksymoronem. Jeśli współużytkują przestrzeń nazw, w jaki sposób mogą mieć tę samą nazwę? Czy to ze względu na * zasięg lokalny *? –

+0

Hmm ... odnośnik "Nazwy przestrzeni" wskazuje, że: "Nazwy Typedef nie mogą być używane jako identyfikatory w tym samym zakresie." –

+3

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

6

Standard C mówi (sekcja 6.2.1 - Zakresy identyfikatorów)

Identyfikator może oznaczać obiekt; funkcja ; znacznik lub element struktury, zrostu lub wyliczenia; nazwa typedef: ; nazwa etykiety; nazwa makro: nazwa; lub parametr makro. Ten sam identyfikator może oznaczać różne jednostki w różnych punktach programu .

K & R2 powiedzieć (A.11.1 - Leksykalne Zakres)

Identyfikatory wpaść nazwy kilku przestrzeni, które nie zakłócają się siebie; ten sam identyfikator może być używany do różnych celów, nawet w w tym samym zakresie, jeśli zastosowania są w różnych przestrzeniach nazw. Te klasy to: obiekty, funkcje, typedef nazwy i stałe wyliczeniowe; etykiety; znaczniki struktur lub związków oraz wyliczenia ; i członków każdej struktury lub pojedynczego związku.

Muszę przyznać, że to mnie martwi. Odczytując drugi cytat, wydaje się, że nazwy zmiennych i powinny się zderzyć w postaci .

+0

Ale nadal nie jestem bardzo jasny, jak "a" oznacza różne podmioty współistniejące w poprzednich kodach. Czy mógłbyś podać mi dodatkowe wyjaśnienie? Dzięki. –

+1

@Neil: inaczej czytałem interpunkcję. Wygląda na to, że obiekty, funkcje, nazwy maszyn i stałe wyliczeniowe są jedną klasą. Dalej (po średniku) etykiety, kolejne znaczniki itp. –

3

Zmienne i typedefs zajmują przestrzeń nazw samo, a może nie nazwy podzielić z innymi identyfikatorami w dokładnie w tym samym zakresie.

Jednak Twoja druga a znajduje się wewnątrz main i obowiązują następujące zasady: druga a przesłania pierwszą.

Można zrobić to samo ze zmiennymi tylko zwykły:

int a; 

int main() { 
    int a; 
} 

Zauważysz, że jeśli przenieść deklaracji zmiennej poza głównym, program nie będzie skompilować.