2009-07-20 20 views
9

Soy nuevo en c, y algunos me han dado algún código fuente que alguien más ha escrito y compilado en Windows.compilando en Windows y Linux

Después de tratar de hacer en compilación en Linux tengo errores porque Linux no es compatible con DWORD, Word y UINT32. Tengo 6 archivos, por ejemplo. A.h, A.c, B.h, B.c, C.h, C.c. Estas palabras clave están en todos los archivos.

Así que estoy pensando en 2 posibles soluciones. Que es mejor #define o typedef.

1)

typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 

2)

#define DWORD unsigned long 
#define WORD unsigned short 
#define UINT32 unsigned int 

Para la segunda parte me pregunto dónde debería poner estas declaraciones. ¿Deberían ir en los archivos de encabezado, o deberían ir en los archivos de origen?

Por ejemplo, ¿debería hacer algo como esto en los archivos de encabezado o en los archivos fuente?

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

Muchas gracias por las sugerencias anteriores,

Respuesta

13

que haya encontrado la solución a sí mismo:

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

poner esto en un archivo de cabecera por separado (typedefs.h) e incluirlo en todas partes. Typedef siempre se prefiere sobre las macros del preprocesador.

Mi recomendación: No use DWORD, WORD u otros tipos de Win32. Por lo general, prefiero usar los tipos estándar C99: uint_t, int_t o uint16_t, uint32_t

+0

Muéstremelo ... eso es lo que obtengo para tipado lento –

+0

Si va a mantener la compilabilidad multiplataforma, puede ponerlo en un archivo llamado windows.h que guarde en una ubicación estándar, ya que ese es el archivo en Windows que te da esas declaraciones. –

+0

si la máquina tiene long = 8 (máquinas de 64 bits), use typedef unsigned int DWORD. – Antarus

4

Los typedefs son definitivamente mejores. #defines son macro de preprocesador y pueden tener consecuencias imprevistas, porque básicamente el preprocesador C realiza una búsqueda y reemplazo globales para define. Los typedefs son instrucciones para el compilador y se ajustan mejor a lo que desea hacer.

2

typedef sería mejor en este caso porque #define es solo un mecanismo genérico, pero typedef es para definir tipos, que es lo que está haciendo.

Yo diría que ponga su código:

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

en un nuevo archivo de cabecera (con guardias #define/#pragma una vez), a continuación, incluir que a partir de los ficheros de cabecera o de origen, según sea necesario.

1

El uso de un typedef convierte el resultado en un tipo real que se coloca en el árbol de sintaxis. (En otras palabras, los compiladores lo conocen y lo reconocen como parte del lenguaje.)

#define, en cambio, es solo una sustitución de texto. Entonces, el compilador nunca llega a saber sobre eso, sino que simplemente ve lo que sea que sea sustituido. Esto puede dificultar la búsqueda de errores de compilación.

Para su caso, probablemente recomendaría typedef. #define tiene su lugar, pero no veo ninguna razón por la cual no quieras usar typedef aquí.

Tenga en cuenta que otras bibliotecas pueden haber definido estos tipos, por lo que puede tener colisiones.Si realmente quieres ser multiplataforma, podrías pensar en definir tipos con el espacio de nombres de tu aplicación de alguna manera. Como

myapp_dword 
myapp_word 

para minimizar las colisiones con otras bibliotecas.

Por último, en realidad recomendaría no tomar en cuenta todo el enfoque que está tomando. Si es posible, lo mejor es usar solo los tipos de letra definidos en el idioma y en la biblioteca estándar C (como size_t, etc.) Su código será más portátil y tendrá menos dolores de cabeza.

+0

Hola. Cuando dice tipos de nombres definidos en el idioma y en la biblioteca estándar de C. ¿Debo cambiar todos los DWORD, WORD y UINT32 por unsigned long, unsigned short y unsigned int? En lugar de usar DWORD, WORD, etc. ¿Eso es porque esos tipos funcionarán tanto en Windows como en Linux? Muchas gracias. – ant2009

+0

Sí, generalmente eso es lo que estoy diciendo. Sin embargo, la biblioteca C estándar también define tipos que tienen garantías específicas sobre el rango. size_t es un buen ejemplo de ese tipo. – Christopher