2010-02-12 21 views
19

pierwsze kody próbki:C++ typedef interpretacja const wskaźników

Przypadek 1:


typedef char* CHARS; 
typedef CHARS const CPTR; // constant pointer to chars 

wzbudzający zastępując ZNAKÓW postać:


typedef char* const CPTR; // still a constant pointer to chars 

Przypadek 2:


typedef char* CHARS; 
typedef const CHARS CPTR; // constant pointer to chars 

Tekstowo zastępuje CHARS staje się:


typedef const char* CPTR; // pointer to constant chars 

W przypadku 2, po wymianie tekstowej CHARS zmieniło się znaczenie typedef. Dlaczego tak jest? W jaki sposób C++ interpretuje tę definicję?

+8

Ogólnie rzecz biorąc, nie jest dobrym pomysłem, aby wskazywać typedef (ukrywając gwiazdę), właśnie dlatego, że const nie może być już wstawiony między wskazanym a typem. – Tronic

+0

Sortuj-z duplikatu http://stackoverflow.com/questions/1808471/is-const-lpvoid-equivalent-to-void-const/1808665 –

Odpowiedz

33

Nie ma sensu analizowanie zachowania typedef na podstawie wymiany tekstowej. Nazwy te nie są makrami, nie są zastępowane tekstowo.

Jak zauważył sam

typedef CHARS const CPTR; 

to samo, co

typedef const CHARS CPTR; 

Jest to więc dla tego samego powodu dlaczego

typedef const int CI; 

ma takie samo znaczenie jak

typedef int const CI; 

Typedef-name nie definiuje nowych typów (tylko aliasy do już istniejących), ale są one "atomowe" w tym sensie, że wszystkie kwalifikatory (takie jak const) mają zastosowanie na najwyższym poziomie, tj. Dotyczą całego typ ukryty za typem-nazwy. Po zdefiniowaniu nazwy typu, nie można "wstrzyknąć" do niej kwalifikatora, aby zmodyfikować jakiekolwiek głębsze poziomy tego typu.

12

Typedef nie jest prostym podstawieniem tekstowym.

typedef const CHARS CPTR; 

Oznacza "typ CPTR będzie stałym elementem CHARS." Ale CHARS jest typem wskaźnika do znaku, więc mówi "typ CPTR będzie typem wskaźnika const do char". To nie pasuje do tego, co widzisz, gdy robisz prosty podtyp.

Innymi słowy,

typedef char * CHARS; 

jest nie taka sama jak

#define CHARS char * 

Składnia typedef jest niczym deklaracji zmiennej, oprócz tego, że zamiast deklarować nazwę docelową być zmienna , deklaruje to jako nową nazwę typu, która może być użyta do zadeklarowania zmiennych typu, którym byłaby zmienna bez parametru typedef.

Oto prosty sposób dowiedzieć się, co typedef deklaruje:

  1. Usuń słowa kluczowego typedef. Teraz będziesz mieć deklarację zmiennej.

    const CHARS CPTR; 
    
  2. dowiedzieć się jaki rodzaj że zmienna jest (niektóre kompilatory mają operatora typeof() który robi dokładnie to i jest bardzo przydatne). Wywołaj ten typ T. W tym przypadku, stały wskaźnik do (niestałego) znaku.

  3. Wymień typedef. Zgłaszasz teraz nowy typ (CPTR), który jest dokładnie taki sam, jak T, stały wskaźnik do (niestałego) znaku.