2010-02-12 21 views
19

En primer lugar, los códigos de ejemplo:C++ typedef interpretación de punteros const

Caso 1:


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

Textually reemplazando CHARS se convierte en:


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

Caso 2:


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

Textualmente reemplazando a CHARS se convierte en:


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

En el caso 2, después de reemplazar textualmente CARACTERES, el significado de la typedef cambiado. ¿Por qué esto es tan? ¿Cómo interpreta C++ esta definición?

+8

En general, es una mala idea typedef punteros (ocultando la estrella), precisamente porque const no se puede insertar entre la punta-a-tipo y la estrella más. – Tronic

+0

Tipo de duplicado de http://stackoverflow.com/questions/1808471/is-const-lpvoid-equivalent-to-void-const/1808665 –

Respuesta

33

No tiene sentido analizar el comportamiento de typedef sobre la base de la sustitución textual. Los nombres tipodef no son macros, no se reemplazan textualmente.

Como se anotó mismo

typedef CHARS const CPTR; 

es lo mismo que

typedef const CHARS CPTR; 

Esto es así por la misma razón por la

typedef const int CI; 

tiene el mismo significado que

typedef int const CI; 

Typedef-name no define nuevos tipos (solo alias a los existentes), pero son "atómicos" en el sentido de que cualquier calificador (como const) se aplica en el nivel superior, es decir, se aplica al tipo oculto detrás del typedef-name. Una vez que haya definido un typedef-name, no podrá "inyectar" un calificador en él para modificar los niveles más profundos del tipo.

12

Typedef no es una simple sustitución textual.

typedef const CHARS CPTR; 

Significa "el tipo de CPTR será una cosa const CHARS". Pero CHARS es un tipo de puntero a char, por lo que esto indica que "el tipo de CPTR será un tipo const pointer-to-char". Esto no coincide con lo que ves cuando haces una sustitución simple.

En otras palabras,

typedef char * CHARS; 

es no lo mismo que

#define CHARS char * 

La sintaxis typedef es como una declaración de variables, excepto que en lugar de declarar el nombre de destino sea una variable , lo declara como un nuevo nombre de tipo que se puede usar para declarar variables del tipo que la variable sería sin typedef.

Aquí es un proceso sencillo para averiguar lo que un typedef declara:

  1. Retire la palabra clave typedef. Ahora tendrá una declaración de variable.

    const CHARS CPTR; 
    
  2. averiguar qué tipo variable es que (algunos compiladores tienen un operador de typeof() que hace exactamente esto y es muy útil). Llame a ese tipo T. En este caso, un puntero constante a char (no constante).

  3. Reemplace el typedef. Ahora está declarando un nuevo tipo (CPTR) que es exactamente del mismo tipo que T, un puntero constante a char (no constante).