C 在windows和linux上编译

C 在windows和linux上编译,c,C,我是c语言的新手,我得到了一些别人在windows上编译的源代码 在尝试在linux上编译之后,我出现了错误,因为linux不支持DWORD、WORD和UINT32。例如,我有6个文件。A.h,A.c,B.h,B.c,c.h,c.c.这些关键字在所有文件中 因此,我想到了两种可能的解决方案。define和typedef哪个更好 (一) (二) 对于第二部分,我想知道我应该把这些声明放在哪里。它们应该放在头文件中,还是放在源文件中 #ifdef WIN32 /* windows stuff */

我是c语言的新手,我得到了一些别人在windows上编译的源代码

在尝试在linux上编译之后,我出现了错误,因为linux不支持DWORD、WORD和UINT32。例如,我有6个文件。A.h,A.c,B.h,B.c,c.h,c.c.这些关键字在所有文件中

因此,我想到了两种可能的解决方案。define和typedef哪个更好

(一)

(二)

对于第二部分,我想知道我应该把这些声明放在哪里。它们应该放在头文件中,还是放在源文件中

#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

非常感谢以上建议,

您自己已经找到了解决方案:

#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肯定更好#定义是预处理器宏,可能会产生意外的后果,因为基本上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\u t等)。您的代码将更易于移植,您的头痛问题也会更少。

请告诉我。。这就是慢速键入的结果如果要保持跨平台的可编译性,您可能只想将其放在一个名为windows.h的文件中,该文件保存在一个标准位置,因为这是windows上获取这些声明的文件。如果机器的long=8(64位机器),请使用typedef unsigned int DWORD.Hello。当你说用语言和C标准库定义的类型名时。我是否应该将所有DWORD、WORD和UINT32更改为无符号长、无符号短和无符号整数。而不是使用DWORD、WORD等。这是因为这些类型在windows和linux上都可以工作?非常感谢。是的,大体上我就是这么说的。但是,标准C库还定义了对范围有特定保证的类型。尺寸是这种类型的一个很好的例子。
myapp_dword
myapp_word