2010-04-07 7 views
11

¿Qué ventaja (si hay alguna) hay para usar typedef en lugar de #define en código C?¿Por qué usar C typedefs en lugar de #defines?

Como un ejemplo, hay alguna ventaja de utilizar

typedef unsigned char UBYTE 

sobre

#define UBYTE unsigned char 

cuando ambos pueden ser utilizados como

void func() 
{ 
     UBYTE byte_value = 0; 

     /* Do some stuff */ 

     return byte_value; 
} 

Obviamente, el pre-procesador intentará expande un #define donde sea que vea uno, lo que no ocurriría con un typedef, pero eso no me parece que sea una ventaja o desventaja particular; No puedo pensar en una situación en la que el uso no genere un error de compilación si hay un problema.

Respuesta

23

Si lo hace un typedef de un tipo de matriz, verá la diferencia:

typedef unsigned char UCARY[3]; 
struct example { UCARY x, y, z; }; 

Hacer eso con un #define ... no, no vamos a ir allí.

[EDITAR]: Otra ventaja es que los depuradores generalmente saben sobre typedefs pero no #defines.

+9

Quoth el preprocesador: "Abusar de mí, abusame de mí ... ¡Hazme sentir querido!" +1 –

+0

Abuso un poco el preprocesador, pero no para los tipos a menos que no haya otra forma. (Lo necesité * una vez * en los últimos 20 años al escribir código para hacer un manejo de enteros multiplataforma de 64 bits. Eso fue sorprendentemente complicado con los compiladores disponibles en ese momento, y terminé con más #ifdefs de los que tendría preferido). –

+0

También funcionan los tipos de puntero ... – hugomg

2

Con #define todo lo que obtienes es la sustitución de cadenas durante el preprocesamiento. typedef presenta un nuevo tipo. Esto hace que sea más fácil encontrar posibles problemas en su código y, en caso de que el compilador sea capaz de darle información más detallada.

+1

no es un * nuevo * tipo - es un alias para un tipo existente - pero es un tipo, sí – philsquared

3

Bueno, viniendo de un C++, perspectiva, un programador de C++ utilizando el código podría tener algo como:

 
template<typename T> class String 
{ 
    typedef T char_type; 
    // ... 
}; 

Ahora, algo si en el código C, que ha escrito como:

 
#define char_type uint32_t // because I'm using UTF-32 

Bueno, va a estar causando serios problemas para los usuarios de su archivo de encabezado. Con typedefs, puede cambiar el valor de typedef dentro de diferentes ámbitos ... mientras que los ámbitos no se respetan con #defines.

Sé que ha etiquetado esta C, pero los programadores de C y los programadores de C++ deben darse cuenta de que sus encabezados pueden ser utilizados por los demás ... y esta es una de esas cosas a tener en cuenta.

2

1) Probablemente la gran ventaja es un código más limpio. Por lo general, el abuso de macros transforma el código en un lío inmanejable, conocido como: "macro sopa".

2) Al usar un typedef, define un nuevo tipo. Usando una macro, realmente sustituyes el texto. El compilador seguramente es más útil cuando se trata de errores typedef.

2
  • Los depuradores y los mensajes de error del compilador se vuelven más útiles si el compilador/depurador conoce el tipo. (esta también es la razón por la que debe usar constantes y no define cuando sea posible)
  • Matrices, como otros han mostrado
  • puede restringir typedefs a un ámbito menor (por ejemplo, una función). Aún más cierto en C++.
Cuestiones relacionadas