【问题标题】:compiling on windows and linux在 windows 和 linux 上编译
【发布时间】:2010-11-12 08:24:37
【问题描述】:

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

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

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

非常感谢以上建议,

【问题讨论】:

    标签: c


    【解决方案1】:

    您自己找到了解决方案:

    #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

    【讨论】:

    • 打败我......这就是我打字慢的原因
    • 如果您要保持跨平台可编译性,您可能只想将它放在一个名为 windows.h 的文件中,并保存在标准位置,因为 Windows 上的文件可以让您获得那些声明。
    • 如果机器有 long = 8(64 位机器),使用 typedef unsigned int DWORD。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      我会说把你的代码:

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

      到一个新的头文件(使用#define guards/#pragma once),然后根据需要从头文件或源文件中包含它。

      【讨论】:

        【解决方案4】:

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

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

        对于您的情况,我可能会推荐 typedef。 #define 有它的位置,但我看不出你不想在这里使用 typedef 的任何理由。

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

        myapp_dword
        myapp_word
        

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

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

        【讨论】:

        • 你好。当您说在语言和 C 标准库中定义的类型名时。我是否应该将所有 DWORD、WORD 和 UINT32 更改为 unsigned long、unsigned short 和 unsigned int。而不是使用 DWORD、WORD 等。是因为这些类型在 windows 和 linux 上都可以工作吗?非常感谢。
        • 是的,这就是我所说的。但是,标准 C 库也定义了对范围有特定保证的类型。 size_t 就是这种类型的一个很好的例子。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        相关资源
        最近更新 更多