2014-11-19 44 views
7

widzę sporadyczne pytania, takie jak: „Jaka jest różnica między deklaracją a definicją”:Dlaczego deklaracja typedef nie nazywa się definicją typedef?

What is the difference between a definition and a declaration? Rozróżnienie to jest ważne i intelektualnie osiąga dwie ważne rzeczy:

  1. Przynosi na pierwszy plan różnica między referencją a referencją
  2. W ten sposób C umożliwia separację w czasie zajęcia między referencją a referencją.

Dlaczego więc deklaracja C typedef nie jest nazywana definicją typedef?

Po pierwsze, jest to oczywiście definicja. Definiuje alias. Nowe imię należy rozumieć jako odnoszące się do istniejącej rzeczy. Ale z pewnością wiąże odniesienie do określonego odniesienia i bez wątpienia jest stwierdzeniem definiującym.

Po drugie, czy nie byłoby to nazywane typedec, jeśli było to oświadczenie?

Po trzecie, czy nie omijałoby wszystkich tych mylących pytań, które ludzie zadają, gdy próbują sporządzić deklarację terminową za pomocą typedef?

+5

Czy jesteś gotowy zaakceptować możliwość, że odpowiedź może być tak prosta, jak "standard nie jest w 100% spójny w swojej terminologii"? –

+1

Deklaracja typedef jest zarówno definicją * jak i * deklaracją. Wyobrażam sobie, że ludzie zazwyczaj określają je jako "deklaracje" zamiast definicji, ponieważ te ostatnie wydają się zbędne. –

+0

I FWIW, dokładny język ze standardu jest następujący: "* W deklaracji, której specyfikatorem klasy pamięci jest' typedef', każdy deklarator definiuje identyfikator będący nazwą 'typedef' oznaczającą typ określony dla identyfikatora * ". –

Odpowiedz

3

A typedef Deklaracja to Definicja.

N1570 6.7p5:

Deklaracja określa interpretację i atrybutów zestawu identyfikatorów. definicja identyfikatora jest deklaracja dla tego identyfikatora, że:

  • dla obiektu, powoduje magazynowanie które mają zostać zarezerwowane dla tego obiektu;
  • dla funkcji, zawiera treść funkcji;
  • dla stałej wyliczeniowej, jest (tylko) deklaracją identyfikatora;
  • dla nazwy typedef, jest pierwszą (lub jedyną) deklaracją identyfikatora.

W C99 ostatnie dwa punkty zostały połączone; C11 wprowadził możliwość dwukrotnego zadeklarowania tego samego typedef.

Zauważ, że tylko obiekty, funkcje, stałe wyliczeniowe i typedef nazwy mogą mieć definicje. Można argumentować, że biorąc pod uwagę:

enum foo { zero, one}; 

to nie ma sensu, aby rozważyć to być definicja z zero i one, ale nie stanowi foo lub enum foo.Z drugiej strony deklaracja enum, struct lub lub union, chociaż tworzy typ, który wcześniej nie istniał, nie definiuje identyfikatora, który jest nazwą tego typu - i dla struct s oraz union, nazwa znacznika może być używane (jako typ niekompletny) jeszcze przed zdefiniowaniem typu. Definicje definiują identyfikatory, a nie (koniecznie) podmioty, do których się odnoszą.

Co do tego, dlaczego w podsekcji tej nie jest określana "definicja", jest częścią sekcji 6.7 "Deklaracje", która obejmuje wszystkie rodzaje deklaracji (z których niektóre są również definicjami). Termin definicja jest zdefiniowany we wstępnej części 6.7.

Co się tyczy nazwy typedef, spowodowało to sporą ilość zamieszania na przestrzeni lat, ponieważ tak naprawdę nie jest to zdefiniowanie typu. Być może typename byłby lepszym wyborem, a nawet typealias. Ale ponieważ określa identyfikator, typedef nie wprowadza w błąd.

+0

Uzgodnione. To jest definicja. Podkreślam, że powinno się nazywać definicją typedef na podstawie (jak sam wskazywałeś) definicji. ;) To dziwna anomalia na widoku i nie zauważyłem przez 20 lat. – Persixty

+0

@DanAllen: Dodałem kilka akapitów do końca mojej odpowiedzi, tak samo, jak publikujesz swój komentarz. –

+0

Keith, myślę, że powiedziałem gdzie indziej, co on definiuje. Definiuje alias. Ale zgadzam się, że wszystkie wymyślone przez ciebie alternatywy są dobre. Opierając się na (użytecznym) wspólnym rozróżnieniu nadawanym ludziom, którzy pytają "jaka jest różnica", definiowanie czegoś tak, by było czymś innym, jest definicją. Po prostu nie definicja czegoś zupełnie nowego! Nikt jeszcze nie twierdził, że to deklaracja (chyba, że ​​myślę, że wszystkie definicje są deklaratywne). Myślę, że gwałtownie się zgadzamy. To dobra rzecz. – Persixty