comstackción en windows y linux

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

Después de intentar comstackr en linux, tengo errores porque linux no es compatible con DWORD, WORD Y UINT32. Tengo 6 archivos por ejemplo. Ah, Ac, Bh, Bc, Ch, Cc 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 debo poner estas declaraciones. ¿Deben ir en los archivos de encabezado, o deben ir en los archivos de origen?

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

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

Muchas gracias por las sugerencias anteriores.

Usted mismo ha encontrado la solución:

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

Ponga esto en un archivo de encabezado separado (typedefs.h) e inclúyalo desde todas partes. Typedef siempre se prefiere a las macros preprocesadoras.

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

Los typedefs son definitivamente más agradables. #defines son macro de preprocesador y pueden tener consecuencias involuntarias, porque básicamente el preprocesador C realiza una búsqueda y reemplazo global para define. Los typedefs son instrucciones para el comstackdor, y mucho más adecuadas para lo que quieres hacer.

typedef sería mejor en esta instancia porque #define es solo un mecanismo genérico, pero typedef es para definir tipos, que es lo que estás 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 encabezado (con #define guardias / # pragma una vez), luego incluya eso desde el encabezado o los archivos de origen según sea necesario.

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

#define , en contraste, es solo una sustitución de texto. Así que el comstackdor nunca llega a saberlo, en lugar de eso solo ve lo que se sustituye. Esto puede hacer que sea más difícil encontrar errores de comstackción.

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

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

 myapp_dword myapp_word 

Para minimizar las colisiones con otras bibliotecas.

Finalmente, realmente recomendaría contra todo el enfoque que está tomando. Si es posible, es mejor usar solo los nombres tipográficos definidos en el idioma y en la biblioteca estándar de C (como size_t, etc.) Su código será más portátil y tendrá menos dolores de cabeza.