我是c的新手,我得到了一些其他人在Windows上编写的源代码。
尝试在linux上编译后我有错误,因为linux不支持DWORD,WORD和UINT32。我有6个文件例如。 A.h,A.c,B.h,B.c,C.h,C.c。这些关键字都在所有文件中。
所以我想到了两种可能的解决方案。哪个更好#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
非常感谢上述建议,
答案 0 :(得分:14)
您自己找到了解决方案:
#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
答案 1 :(得分:4)
Typedef肯定更好。 #defines是预处理器宏,可能会产生意想不到的后果,因为C预处理器基本上对定义执行全局搜索和替换。 Typedef是编译器的指令,更适合你想要做的事情。
答案 2 :(得分:2)
在这种情况下,typedef会更好,因为#define只是一种通用机制,但是typedef用于定义你正在做的类型。
我会说你的代码:
#ifdef WIN32
/* windows stuff */
#else
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned int UNINT32;
#endif
进入一个新的头文件(使用#define guards / #pragma一次),然后根据需要从头文件或源文件中包含它。
答案 3 :(得分:1)
使用typedef将结果转换为放入语法树的实际类型。 (换句话说,编译器知道它并将其识别为语言的一部分。)
相比之下, #define
只是一种文字替代。所以编译器永远不会知道它,它只是看到被替换的任何东西。这可以使查找编译错误更加困难。
对于你的情况,我可能会推荐typedef。 #define有它的位置,但我看不出你为什么不想在这里使用typedef。
请注意,其他库可能已定义了这些类型,因此您可能会发生冲突。如果您真的想要跨平台,那么您可能会考虑使用应用程序命名空间以某种方式定义类型。喜欢
myapp_dword
myapp_word
为了尽量减少与其他库的冲突。
最后,我实际上建议不要采取你正在采取的整个方法。如果可能的话,最好只使用语言和C标准库中定义的类型名(如size_t等)。您的代码将更具可移植性,并且您的头痛会更少。