2009-07-20 144 views
9

我是c新手,我已經給了一些其他人編寫的在Windows上編譯的源代碼。在windows和linux上編譯

在嘗試在Linux上編譯後,我有錯誤,因爲Linux不支持DWORD,WORD和UINT32。例如,我有6個文件。 A.h,A.c,B.h,B.c,C.h,C.c.這些關鍵字在所有文件中。

所以我想到2種可能的解決方案。哪個更好#define或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 

對於第二部分,我想知道我應該在哪裏把這些聲明。它們應該放在頭文件中,還是放在源文件中?

例如,我應該在頭文件還是源文件中做這樣的事情?

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

非常感謝上述建議,

回答

13

你自己已經找到了解決辦法:

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

在一個單獨的頭文件(typedefs.h)將這個並將其包括來自世界各地。 Typedef總是比預處理器宏更受歡迎。

我的建議:不要使用DWORD,WORD或其他Win32類型。我通常更喜歡使用C99標準類型:uint_t,int_t或uint16_t,uint32_t

+0

打我吧..多數民衆贊成我得到的打字很慢 – 2009-07-20 15:03:56

+0

如果你要保持跨平臺編譯能力,你可能只想把它放在一個名爲windows.h文件,你保持在一個標準的位置,因爲這是Windows上的文件,可以讓你獲得這些聲明。 – 2009-07-20 15:08:23

4

Typedefs絕對更好。 #defines是預處理器宏,可能會產生意想不到的後果,因爲C預處理器基本上執行全局搜索和替換定義。 Typedef是編譯器的指令,更適合你想要做的事情。

2

typedef在這個實例中會更好,因爲#define只是一個通用機制,但typedef是用於定義您正在做的類型。

我會說把你的代碼:

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

到一個新的頭文件(#定義衛士/#編譯一次),然後包括從頁眉或源文件是必要的。

1

使用typedef將結果轉換爲放入語法樹中的實際類型。 (換句話說,編譯器知道它並將其識別爲語言的一部分。)

#define相反,它只是一個文本替換。所以編譯器永遠不會知道它,它只是看到它被取代的東西。這可以使查找編譯錯誤變得更困難。

對於你的情況,我可能會推薦typedef。 #define有它的位置,但我不明白爲什麼你不想在這裏使用typedef。

請注意,其他庫可能已經定義了這些類型,因此您可能會發生衝突。如果你真的想跨平臺,你可能會考慮用你的應用程序的命名空間來定義類型。像

myapp_dword 
myapp_word 

爲了儘量減少與其他庫的衝突。

最後,我實際上會推薦您採取的整個方法。如果可能的話,最好只使用在語言和C標準庫中定義的類型名稱(如size_t等)。您的代碼將更具可移植性,並且您的頭痛更少。