在Windows和Linux上编译

我是c的新手,我得到了一些其他人在Windows上编写的源代码。

尝试在linux上编译后我有错误,因为linux不支持DWORD,WORD和UINT32。 我有6个文件例如。 啊,Ac,Bh,Bc,Ch,Cc这些关键字都在所有文件中。

所以我在考虑两种可能的解决方案。 哪个更好#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

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

在这种情况下,typedef会更好,因为#define只是一种通用机制,但是typedef用于定义你正在做的类型。

我会说你的代码:

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

进入一个新的头文件(#define guards / #pragma一次),然后根据需要包含头文件或源文件中的文件。

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

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

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

请注意,其他库可能已定义了这些类型,因此您可能会发生冲突。 如果您真的想要跨平台,您可能会想到以某种方式使用应用程序命名空间定义类型。 喜欢

 myapp_dword myapp_word 

为了尽量减少与其他图书馆的冲突。

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