¿Cuál es el uso de la palabra clave typedef en C? ¿Cuándo es necesario?¿Cuál es el uso de typedef?
Respuesta
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.
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.
Puede alias otro tipo.
typedef unsigned int uint; /* uint is now an alias for "unsigned int" */
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
.
typedef no introduce un tipo nuevo pero simplemente proporciona un nuevo nombre para un tipo.
TYPEDEF
se puede utilizar para:
Tipos que combinan matrices, estructuras, punteros o funciones.
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.A
typedef
puede proporcionar un nombre simple para un molde de tipo complicado.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.
¿Podría ampliar no usar typedef con structs, por favor? –
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);
}
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.
*/
- 1. ¿Cuál es el significado de este typedef?
- 2. ¿Uso válido de typedef?
- 3. ¿Es portable el uso público de typedef privado?
- 4. ¿Cuál es el punto de "typedef algo tipo"?
- 5. ¿cuál es el uso básico de alignment_storage?
- 6. ¿Cuál es el uso de singletonList?
- 7. ¿Cuál es el uso de window.external?
- 8. ¿Cuál es el uso previsto de IllegalStateException?
- 9. ¿Cuál es el uso correcto de DataContext.Refresh()?
- 10. ¿Cuál es el uso de @SuppressWarnings
- 11. ¿Cuál es el uso de autómatas finitos?
- 12. ¿Cuál es el uso correcto de EnsureChildControls()?
- 13. ¿Cuál es el uso de la sintaxis = =?
- 14. ¿Cuál es el uso de Log4j API?
- 15. ¿Cuál es el uso principal de MarshalByRefObject?
- 16. ¿Cuál es el uso de LOCAL_MODULE_TAGS?
- 17. ¿Cuál es el uso de AtomicReferenceArray?
- 18. ¿Cuál es el uso de "indulgente"?
- 19. ¿Cuál es el uso de - [NSUserDefaults registerDefaults:]?
- 20. ¿cuál es el uso de string.Clone()?
- 21. ¿Cuál es el uso de Deployment.Current.Dispatcher.BeginInvoke (() => {...})?
- 22. ¿Cuál es el uso de Indexers?
- 23. ¿Cuál es la diferencia entre `alias` y` typedef`?
- 24. ¿Cuál es el uso del uso de init() en JavaScript?
- 25. ¿Cuál es el propósito del uso?
- 26. ¿Cuáles son las diferencias entre typedef y el uso?
- 27. ¿Es un typedef una definición?
- 28. CGRectIntegral ¿cuál es su uso?
- 29. ¿Cuál es el significado de la siguiente sintaxis en iOS ?. typedef void (^ algo) (NSInteger * a);
- 30. ¿Qué es un typedef en Dart?
¿Hay alguna vez una razón para no 'typedef' a 'struct'? – Panzercrisis
@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). –