在windows和linux上编译

问题描述:

我是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 

非常感谢上述建议,

你自己已经找到了解决办法:

#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

Typedefs绝对更好。 #defines是预处理器宏,可能会产生意想不到的后果,因为C预处理器基本上执行全局搜索和替换定义。 Typedef是编译器的指令,更适合你想要做的事情。

typedef在这个实例中会更好,因为#define只是一个通用机制,但typedef是用于定义您正在做的类型。

我会说把你的代码:

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

到一个新的头文件(#定义卫士/#编译一次),然后包括从页眉或源文件是必要的。

使用typedef将结果转换为放入语法树中的实际类型。 (换句话说,编译器知道它并将其识别为语言的一部分。)

#define相反,它只是一个文本替换。所以编译器永远不会知道它,它只是看到它被取代的东西。这可以使查找编译错误变得更困难。

对于你的情况,我可能会推荐typedef。 #define有它的位置,但我不明白为什么你不想在这里使用typedef。

请注意,其他库可能已经定义了这些类型,因此您可能会发生冲突。如果你真的想跨平台,你可能会考虑用你的应用程序的命名空间来定义类型。像

myapp_dword 
myapp_word 

为了尽量减少与其他库的冲突。

最后,我实际上会推荐您采取的整个方法。如果可能的话,最好只使用在语言和C标准库中定义的类型名称(如size_t等)。您的代码将更具可移植性,并且您的头痛更少。