2010-02-12 12 views
19

Innanzitutto, codici di esempio:C++ typedef interpretazione dei puntatori const

Caso 1:


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

testualmente sostituzione CARATTERI diventa:


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

Caso 2:


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

Sostituzione manuale di CHARS diventa:


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

Nel caso 2, dopo la sostituzione testualmente CHARS, il significato del typedef cambiato. Perché è così? Come interpreta C++ questa definizione?

+8

In generale, è una cattiva idea di typedef puntatori (nascondendo la stella), proprio perché const non può essere inserito tra la punta-to-type e la stella più. – Tronic

+0

Sort-of duplicate of http://stackoverflow.com/questions/1808471/is-const-lpvoid-equivalent-to-void-const/1808665 –

risposta

33

Non ha senso per analizzare typedef comportamento sulla base di sostituzione del testo. I nomi typedef non sono macro, non vengono sostituiti testualmente.

Come annotato da soli

typedef CHARS const CPTR; 

è la stessa cosa di

typedef const CHARS CPTR; 

Questo è così per la stessa ragione per cui

typedef const int CI; 

ha lo stesso significato di

typedef int const CI; 

I nomi typedef non definiscono nuovi tipi (solo alias di quelli esistenti), ma sono "atomici" nel senso che tutti i qualificatori (come const) si applicano al livello più alto, cioè si applicano all'intero Tipo nascosto dietro il nome typedef. Una volta definito un nome typedef, non è possibile "inserire" un qualificatore in esso in modo che possa modificare qualsiasi livello più profondo del tipo.

12

Typedef non è una sostituzione semplice testuale.

typedef const CHARS CPTR; 

Significa "il tipo CPTR sarà una cosa const CHARS." Ma CHARS è un tipo pointer-to-char, quindi questo dice "il tipo CPTR sarà un tipo const pointer-to-char." Questo non corrisponde a quello che vedi quando fai una semplice sostituzione.

In altre parole,

typedef char * CHARS; 

non è uguale

#define CHARS char * 

La sintassi typedef è come una dichiarazione di variabile, salvo che invece di dichiarare il nome di destinazione di una variabile , lo dichiara come un nuovo nome di tipo che può essere usato per dichiarare variabili del tipo che la variabile sarebbe senza typedef.

Ecco un processo semplice per capire cosa un typedef sta dichiarando:

  1. rimuovere la parola chiave typedef. Ora avrai una dichiarazione variabile.

    const CHARS CPTR; 
    
  2. capire che tipo che è variabile (alcuni compilatori hanno un operatore typeof() che fa esattamente questo ed è molto utile). Chiama quel tipo T. In questo caso, un puntatore costante al carattere (non costante).

  3. Sostituire typedef. Ora stai dichiarando un nuovo tipo (CPTR) che è esattamente lo stesso tipo di T, un puntatore costante al carattere (non costante).