Nie pisałem żadnego C ++ od lat i teraz staram się do niego wrócić. Później natknąłem się na to i pomyślałem o poddaniu się:
typedef enum TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
Co to jest? Dlaczego typedef
użyto tutaj słowa kluczowego? Dlaczego nazwa TokenType
pojawia się dwukrotnie w tej deklaracji? Czym różni się semantyka od tego:
enum TokenType
{
blah1 = 0x00000000,
blah2=0x01000000,
blah3=0x02000000
};
Jest to dziedzictwo C w C, jeśli:
będziesz musiał go użyć, robiąc coś takiego:
Ale jeśli to zrobisz:
Będziesz mógł zadeklarować:
Ale w C ++ możesz używać tylko poprzedniej definicji i używać jej tak, jakby była w typedefinie C.
źródło
Nie musisz tego robić. W C (nie w C ++) wymagane było użycie enumame Enumame w celu odniesienia do elementu danych wyliczonego typu. Aby uprościć to ty pozwolono typedef go do jednego typu nazwa danych.
dozwolone funkcje przyjmujące parametr wyliczenia jako
zamiast dłuższego
Zauważ, że nazwa typu nie musi być równa nazwie wyliczenia. To samo dzieje się z strukturami.
Z drugiej strony w C ++ nie jest to wymagane, ponieważ do wyliczeń, klas i struktur można uzyskać bezpośredni dostęp do typów po ich nazwach.
źródło
W C jest to dobry styl, ponieważ możesz zmienić typ na coś oprócz wyliczenia.
W C ++ możesz zdefiniować wyliczenie, aby skompilowało się jako C ++ lub C.
źródło
In C++ you can *typedef* the enum so that it will compile as C++ or C.
? Powiedziałeś:In C++ you can define the enum so that it will compile as C++ or C.
zauważ, jak zmieniłem twójdefine
natypedef
. Cóż ... Przypuszczamtypedef
ing jest zdefiniowanie.Holdover z C.
źródło
Niektórzy twierdzą, że C nie ma przestrzeni nazw, ale nie jest to technicznie poprawne. Ma trzy:
enum
,union
, istruct
)typedef enum { } XYZ;
deklaruje anonimowe wyliczenie i importuje je do globalnej przestrzeni nazw o nazwieXYZ
.typedef enum ABC { } XYZ;
deklaruje wyliczenie nazwaneABC
w przestrzeni nazw znaczników, a następnie importuje je do globalnej przestrzeni nazw jakoXYZ
.Niektóre osoby nie chcą zawracać sobie głowy oddzielnymi przestrzeniami nazw, więc wpisują wszystko. Inni nigdy nie pisali na maszynie, ponieważ chcą przestrzeni nazw.
źródło
To trochę stare, ale mam nadzieję, że docenisz link, który zamierzam wpisać, doceniając go, gdy natknąłem się na niego w tym roku.
Oto jest . Powinienem zacytować wyjaśnienie, które zawsze przychodzi mi do głowy, gdy muszę zrozumieć kilka nieprzyjemnych maszynopisów:
Jak wiele osób wcześniej powiedziało, nie ma potrzeby używania typedefs deklarujących wyliczenia w C ++ . Ale to jest wyjaśnienie składni typedef! Mam nadzieję, że to pomoże (prawdopodobnie nie OP, ponieważ minęło prawie 10 lat, ale każdy, kto stara się zrozumieć tego rodzaju rzeczy).
źródło
W niektórych przewodnikach po kodzie C napisano, że wersja „typedef” jest preferowana ze względu na „przejrzystość” i „prostotę”. Nie zgadzam się, ponieważ typedef zaciemnia prawdziwą naturę zadeklarowanego obiektu. W rzeczywistości nie używam typedefs, ponieważ deklarując zmienną C, chcę mieć jasność co do tego, czym właściwie jest obiekt. Ten wybór pomaga mi szybciej zapamiętywać, co naprawdę robi stary fragment kodu, i pomoże innym, gdy zachowa kod w przyszłości.
źródło
Rzeczywista odpowiedź na pytanie „dlaczego” (które jest zaskakująco ignorowane przez istniejące odpowiedzi na górze tego starego pytania) jest taka, że
enum
deklaracja ta prawdopodobnie znajduje się w pliku nagłówkowym, który ma być kompatybilny zarówno jako kod C, jak i C ++ (tj. zawarte zarówno w implementacjach C, jak i C ++). Sztuka pisania takich plików nagłówkowych zależy od zdolności autora do wybierania funkcji językowych, które mają odpowiednie kompatybilne znaczenie w obu językach.źródło