2009-07-20 25 views
9

Ich bin neu in c, und ich habe einige Quellcode, den jemand anderes geschrieben hat, die auf Windows kompiliert wurde gegeben.Kompilieren unter Windows und Linux

Nach dem Versuch, in machen kompilieren auf Linux ich Fehler, weil Linux nicht DWORD, WORD, UND UINT32 unterstützen. Ich habe zum Beispiel 6 Dateien. A.h, A.c., B.h., B.c., C.h., C.c. Diese Schlüsselwörter sind in allen Dateien enthalten.

Also denke ich über 2 mögliche Lösungen nach. Was ist besser #define oder 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 

Für den zweiten Teil frage ich mich, wo soll ich diese Erklärungen stellen. Sollten sie in die Header-Dateien gehen, oder sollen sie in die Quelldateien gehen?

Zum Beispiel kann ich tun, so etwas wie dies in den Header-Dateien, oder in den Quelldateien?

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

Vielen Dank für die oben genannten Vorschläge,

Antwort

13

Sie die Lösung selbst gefunden haben:

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

Setzen Sie diese in einer separaten Header-Datei (typedefs.h) und es ist von überall her. Typedef wird gegenüber Preprozessor-Makros immer bevorzugt.

Meine Empfehlung: Verwenden Sie DWORD, WORD oder anderen Win32-Typen nicht. Ich ziehe es in der Regel C99 Standard-Typen zu verwenden: uint_t, int_t oder uint16_t, uint32_t

+0

Beat mich dazu .. das ist, was ich für die langsame Eingabe –

+0

erhalten Wenn Sie plattformübergreifende Kompilierbarkeit pflegen werden, möchten Sie es vielleicht einfach in eine Datei namens windows.h, die Sie in einem Standard-Speicherort, denn das ist die Datei unter Windows, die diese Deklarationen enthält. –

+0

Wenn Maschine lang = 8 (64-Bit-Maschinen) hat, verwenden Sie typedef unsigned int DWORD. – Antarus

4

Typedefs sind auf jeden Fall schöner. #defines sind Präprozessor-Makros und können unbeabsichtigte Konsequenzen haben, da der C-Präprozessor im Grunde ein globales Suchen und Ersetzen für Defines durchführt. Typedefs sind Anweisungen für den Compiler und viel besser geeignet für das, was Sie tun möchten.

2

typedef würde in diesem Fall besser sein, weil #define nur ein generischer Mechanismus ist aber typedef ist Typen zu definieren das ist, was Sie tun.

Ich würde Ihren Code setzen sagen:

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

in eine neue Header-Datei (mit #define Wachen/# pragma einmal), umfasst dann, dass aus den Kopf- oder Quelldateien nach Bedarf.

1

ein typedef schaltet das Ergebnis in einem tatsächlichen Typ, der in den Syntaxbaum gesetzt wird. (Mit anderen Worten, der Compiler weiß davon und erkennt es als einen Teil der Sprache.)

#define, im Gegensatz, ist nur eine Textersetzung. Der Compiler erfährt also nie etwas darüber, sondern sieht nur, was ersetzt wird. Dies kann das Auffinden von Kompilierungsfehlern erschweren.

Für Ihren Fall würde ich wahrscheinlich typedef empfehlen. #define hat seinen Platz, aber ich kann keinen Grund sehen, warum du hier nicht typedef benutzen willst.

Beachten Sie, dass andere Bibliotheken diese Typen möglicherweise definiert haben, sodass Sie möglicherweise Kollisionen haben.Wenn Sie wirklich plattformübergreifend sein möchten, denken Sie vielleicht darüber nach, Typen mit dem Namespace Ihrer App zu definieren. Wie

myapp_dword 
myapp_word 

um Kollisionen mit anderen Bibliotheken zu minimieren.

Schließlich würde ich eigentlich empfehlen gegen den gesamten Ansatz, den Sie nehmen. Wenn es möglich ist, ist es am besten, nur die in der Sprache und in der C-Standardbibliothek definierten Typnamen zu verwenden (wie size_t usw.). Ihr Code wird tragbarer und Sie werden weniger Kopfschmerzen haben.

+0

Hallo. Wenn Sie Typnamen angeben, die in der Sprache und in der C-Standardbibliothek definiert sind. Sollte ich alle DWORD, WORD und UINT32 diese zu unsigned long, unsigned short und unsigned int. Anstatt DWORD, WORD usw. zu verwenden, ist das so, weil diese Typen sowohl auf Windows als auch auf Linux funktionieren? Danke vielmals. – ant2009

+0

Ja, das ist generell das, was ich sage. Die Standard-C-Bibliothek ALSO definiert jedoch Typen, die bestimmte Garantien für den Bereich haben. size_t ist ein gutes Beispiel für einen solchen Typ. – Christopher

Verwandte Themen