2011-04-18 13 views
6

Estoy realmente confundido. Estoy leyendo TC++ PL de Bjarne Stroustrup (edición especial, 19ª impresión, septiembre de 2010). Permítanme citar una parte del libro, destacando mi confusión:¿Es un typedef una definición?

char ch; 
string s; 
int count = 1; 
const double pi = 3.1415926535897932385; 
extern int error_number; 

const char* name = "Njal"; 
const char* season[] = { "spring", "summer", "fall", "winter" }; 

struct Date { int d, m, y; }; 
int day(Date* p) { return p->d; } 
double sqrt(double); 
template<class T> T abs(T a) { return a<0 ? -a : a; } 

typedef complex<short> Point; 
struct User; 
enum Beer { Carlsberg, Tuborg, Thor }; 
namespace NS { int a; } 

Como puede verse a partir de estos ejemplos, una declaración puede hacer más que simplemente asociar un tipo con un nombre. La mayoría de estas declaraciones también son definiciones; es decir, también definen una entidad para el nombre al que se refieren. Para ch, esa entidad es la cantidad apropiada de memoria que se utilizará como variable: se asignará la memoria . Por día es la función especificada. Para la constante constante , es el valor 3.1415926535897932385. Para Fecha, esa entidad es un nuevo tipo. Para Point es el tipo complejo para que Point se convierta en un sinónimo para el complejo. De las declaraciones anteriores, sólo éstos no son también definiciones:

double sqrt(double); 
extern int error_number; 
struct User; 
typedef complex<short> Point <-- WTF; 

no es la frase en negrita en conflicto con la lista que figura a continuación es? ¿Es un typedef solo una declaración o también una definición? ¿Es esto un error en el libro?

+1

'bjarne-stroustrup' es una etiqueta ahora? –

+0

Parece que ha sido una etiqueta por un tiempo. –

Respuesta

6

Aunque estoy totalmente confundido por esto. El estándar es claro. Typedef es solo una declaración. No definición

3.1-2

Una declaración es una definición menos se declara una función sin especificando el cuerpo de la función (8.4), que contiene el especificador extern (7.1.1) o una linkage-specification24) (7.5) y ni un inicializador ni un función-cuerpo, declara un miembro de datos estático en una declaración de clase (9.4), es una declaración de nombre de clase (9.1), o es un typedef declaración (7.1.3), a using-declaration (7.3.3), o using-directive (7.3.4).

Editar: Oh, me acabo de dar cuenta por qué. Puede escribir una declaración, por lo tanto, un typedef tiene que ser una declaración en sí misma.

+0

de hecho typedef acaba de introducir un sinónimo, y no es necesario crear una instancia de un sinónimo. –

0

Una definición crea un objeto, por lo que:

int x; 

es una definición de un int llamada x. Un typedef no crea un objeto, sino que crea un nuevo nombre para un tipo existente, por lo que no es una definición.

+1

'struct Fecha {int d, m, y; }; 'tampoco crea un objeto; sigue siendo una definición (de tipo). – sepp2k

+0

¿Qué te hace pensar que esa definición debe crear un objeto? La definición de la función en línea puede crear nada aún siendo una definición. La definición de una clase tampoco puede crear nada. Solo la definición de un objeto crea un objeto. –

2

Un typedef es un tipo de alias, no es un tipo nuevo en sí mismo. Con un typedef, no se define nada nuevo, sino que a una definición existente se le asigna un segundo nombre, al igual que nightcracker es su alias, no su nombre real, pero ambos se refieren a la misma entidad: usted.

+0

No existe un tipo de alias. –

+0

@Let_Me_Be - cómo lo llamarías, entonces (excepto "type typedef" o algo así)? –

+0

@Let_Me_Be: ¿Qué quieres decir? Un alias es otro nombre para algo. Y eso es exactamente lo que es un typedef, otro nombre para un tipo. –

1

¿Cómo distingue entre una declaración que es una definición y una declaración que no?

Fácil: solo puede tener una definición de cada entidad, pero tantas declaraciones como desee.

Porque se puede decir

typedef int Foo; 
typedef int Foo; 

sin ningún problema, esto no es una definición. O tal vez porque esto no es una definición, puedes decir eso. De cualquier manera, tu compilador puede decir fácilmente cuál es cuál.

Tenga en cuenta que en C es ilegal para repetir un typedef, por lo que una declaración typedef es una definición en C.

Cuestiones relacionadas