2010-04-02 16 views

Respuesta

24

de Wikipedia:

typedef es una palabra clave en los lenguajes de programación C y C++. El objetivo de typedef es asignar nombres alternativos a los tipos existentes, con mayor frecuencia a aquellos cuya declaración estándar es engorrosa, potencialmente confusa o que puede variar de una implementación a otra.

Y:

K & R indica que hay dos razones para utilizar un typedef. En primer lugar, proporciona un medio para hacer que un programa sea más portátil. En lugar de tener que cambiar un tipo en todas partes, aparece a lo largo de los archivos fuente del programa, solo se necesita cambiar una sola declaración typedef. Segundo, un typedef puede hacer que una declaración compleja sea más fácil de entender.

Y un argumento en contra:

Él (Greg K. H.) sostiene que esta práctica no sólo ofusca innecesariamente código, sino que también puede causar un mal uso a los programadores accidentalmente grandes estructuras pensando que sean los tipos simples.

35

typedef es para definir algo como un tipo . Por ejemplo:

typedef struct { 
    int a; 
    int b; 
} THINGY; 

... THINGY define como la estructura dada. De esta manera, se puede utilizar de esta manera:

THINGY t; 

... en lugar de:

struct _THINGY_STRUCT { 
    int a; 
    int b; 
}; 

struct _THINGY_STRUCT t; 

... que es un poco más detallado. typedefs puede hacer que algunas cosas drásticamente más claras, especialmente los punteros a las funciones.

+1

¿Hay alguna vez una razón para no 'typedef' a 'struct'? – Panzercrisis

+1

@Panzercrisis: no conozco ninguno, ciertamente lo estaba haciendo rutinariamente ~ 1989-1998 (los años en los que hice la mayor parte de mi trabajo en C), pero no soy un experto en C (nunca más). –

3

Puede alias otro tipo.

typedef unsigned int uint; /* uint is now an alias for "unsigned int" */ 
12

typedef se utiliza para crear alias para tipos existentes. Es un poco de misnomer: typedef no define nuevos tipos ya que los nuevos tipos son intercambiables con el tipo subyacente. Los typedefs se utilizan a menudo para mayor claridad y portabilidad en las definiciones de interfaz cuando el tipo subyacente está sujeto a cambios o no es importante.

Por ejemplo:

// Possibly useful in POSIX: 
typedef int filedescriptor_t; 

// Define a struct foo and then give it a typedef... 
struct foo { int i; }; 
typedef struct foo foo_t; 

// ...or just define everything in one go. 
typedef struct bar { int i; } bar_t; 

// Typedef is very, very useful with function pointers: 
typedef int (*CompareFunction)(char const *, char const *); 
CompareFunction c = strcmp; 

typedef también se puede utilizar para dar nombres a tipos sin nombre. En tales casos, typedef será el único nombre para dicho tipo:

typedef struct { int i; } data_t; 
typedef enum { YES, NO, FILE_NOT_FOUND } return_code_t; 

Las convenciones de nombres difieren. Por lo general, se recomienda utilizar un trailing_underscore_and_t o CamelCase.

3

typedef no introduce un tipo nuevo pero simplemente proporciona un nuevo nombre para un tipo.

TYPEDEF se puede utilizar para:

  1. Tipos que combinan matrices, estructuras, punteros o funciones.

  2. Para facilitar la portabilidad, typedef el tipo que necesita. Luego, cuando transfiera el código a diferentes plataformas, seleccione el tipo correcto haciendo los cambios solo en typedef.

  3. A typedef puede proporcionar un nombre simple para un molde de tipo complicado.

  4. typedef también se puede utilizar para dar nombres a tipos sin nombre. En tales casos, typedef será el único nombre para dicho tipo.

NOTA: -no debería USO CON TYPEDEF estructuras. SIEMPRE UTILICE UNA ETIQUETA EN UNA DEFINICIÓN DE ESTRUCTURA INCLUSO SI NO ES NECESARIO.

+2

¿Podría ampliar no usar typedef con structs, por favor? –

3

de Wikipedia: ".. K & R afirma que hay dos razones para utilizar un typedef En primer lugar ... En segundo lugar, un typedef puede hacer una declaración complejo más fácil de entender"

Aquí es un ejemplo a la segunda razón de la utilización de typedef, simplificando tipos complejos (del tipo complejo se toma de K & R "El lenguaje de programación C segunda edición p. 136).

char (*(*x([])()) 

x es una función que devuelve puntero al array [] del puntero a función que devuelve carbón.

podemos hacer la declaración anterior comprensible usando typedefs. Por favor, vea el ejemplo a continuación.

typedef char (*pfType)(); // pf is the type of pointer to function returning 
          // char 
typedef pfType pArrType[2]; // pArr is the type of array of pointers to 
          // functions returning char 

char charf() 
{ return('b'); 
} 

pArrType pArr={charf,charf}; 
pfType *FinalF()  // f is a function returning pointer to array of 
        // pointer to function returning char 
{ 
return(pArr); 
} 
1

Explicando el uso de typedef en el siguiente ejemplo. Además, Typedef se usa para hacer que el código sea más legible.

#include <stdio.h> 
#include <math.h> 

/* 
To define a new type name with typedef, follow these steps: 
1. Write the statement as if a variable of the desired type were being declared. 
2. Where the name of the declared variable would normally appear, substitute the new type name. 
3. In front of everything, place the keyword typedef. 
*/ 

// typedef a primitive data type 
typedef double distance; 

// typedef struct 
typedef struct{ 
    int x; 
    int y; 
} point; 

//typedef an array 
typedef point points[100]; 

points ps = {0}; // ps is an array of 100 point 

// typedef a function 
typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point) 

// prototype a function  
distance findDistance(point, point); 

int main(int argc, char const *argv[]) 
{ 
    // delcare a function pointer 
    distanceFun_p func_p; 

    // initialize the function pointer with a function address 
    func_p = findDistance; 

    // initialize two point variables 
    point p1 = {0,0} , p2 = {1,1}; 

    // call the function through the pointer 
    distance d = func_p(p1,p2); 

    printf("the distance is %f\n", d); 

    return 0; 
} 

distance findDistance(point p1, point p2) 
{ 
distance xdiff = p1.x - p2.x; 
distance ydiff = p1.y - p2.y; 

return sqrt((xdiff * xdiff) + (ydiff * ydiff)); 
} In front of everything, place the keyword typedef. 
    */ 
Cuestiones relacionadas