【问题标题】:What is the smallest Windows header I can #include to define DWORD?我可以#include 来定义 DWORD 的最小 Windows 标头是多少?
【发布时间】:2010-03-18 21:03:16
【问题描述】:

我有一个自己的小头文件,它声明了几个函数,其中一个函数的返回类型为DWORD。我不愿意拖入windows.h 只是为了获得这种类型的官方定义,因为该文件很大,而且我的标头将用于许多不需要它的源模块中。

当然,实际上我知道DWORD 只是unsigned int,但如果可能的话,我更喜欢包含官方头文件的更卫生的方法。

this page 上,它说DWORDwindef.h 中定义,但不幸的是,只包含这个小文件会直接导致编译错误——显然它希望被其他头文件包含。 (此外,我的文件是头文件这一事实也意味着我不能只声明WIN32_LEAN_AND_MEAN,因为#includes 我的文件的源文件可能需要将其保留为未定义。)

有什么想法吗?我知道这不是世界末日——我可以继续#include <windows.h>——但我想有人可能有更好的主意!

[编辑] 感谢您的回复。对于那些建议使用不同类型的人,让我解释一下为什么在这种情况下这是不可取的:我在不同的源文件中设置了两个函数的不同平台特定版本,并要求 CMake 配置检测当前平台并选择建造哪一个。在 Windows 上,我的函数如下所示:

typedef DWORD TimePoint;
TimePoint GetTimeNow(void);
double TimeDifference(TimePoint start, TimePoint end);

GetTimeNow() 的 Windows 版本只调用了 Windows API timeGetTime(),它的返回类型为 DWORD,因此它必须具有相同的返回类型。 (在其他平台上,TimePoint 将具有不同的类型,例如,在 UNIXy 平台上为 struct timeval。)实际上,TimePoint 类型的值是不透明的,您唯一可以对它们做的事情就是将其中两个传递给TimeDifference() 以秒为单位测量它们之间的经过时间。这使得跨平台开发成为可能。不幸的是,这仍然意味着客户端代码必须知道TimePoint 的具体类型。

【问题讨论】:

标签: c windows header


【解决方案1】:

包含 Windows.h 并使用预编译的头文件。顺便说一句,您可以先定义 WIN32_LEAN_AND_MEAN,然后再取消定义!

【讨论】:

  • 预编译头文件是个好主意,但我担心包含 windows.h 和 WIN32_LEAN_AND_MEAN 之后再包含它可能会导致后者 #include 由于#include 保护而被忽略。跨度>
【解决方案2】:

我相信您曾经能够包含 winbase.h,但现在似乎不再如此了。我见过的所有资源都推荐 windows.h,带有 WIN32_LEAN_AND_MEAN 选项。正如您所指出的,后一种优化对您没有帮助。

你可以这样做。

#ifndef _WINDEF_
typedef unsigned long DWORD;
#endif

不干净,但高效。这个 typedef 不可能永远改变。

【讨论】:

    【解决方案3】:

    DWORD 始终是 32 位无符号整数,因此使用 DWORDunsigned longuint32_t 并不重要。如果所有三种类型都引用 32 位无符号 int,编译器将认为它们是等价的。

    由于这是特定于平台的文件的一部分,我认为您不必担心可移植性。哎呀,深入研究标头以找到 DWORD 的本机类型,然后将该 typedef 放入您的标头中。 C 编译器接受重复的 typedef,只要它们具有相同的基础类型。

    【讨论】:

    • 其实这不是一个坏主意:由于兼容性原因,Windows 被限制永远无法更改 DWORD 的类型,所以我不妨挖掘该类型并直接使用它。
    • uint32_t 不是可移植的,代表无符号的 32 位实体吗?哎呀,叫我线程死灵......为什么这个作为一个新的questuin弹出? :(
    【解决方案4】:

    Use this file: include <IntSafe.h>

    【讨论】:

      【解决方案5】:

      我会说自己定义它。这样,它就更加独立于平台(当然,我不知道其余的代码是否需要 Windows)。如果您不想这样做,请使用预编译的标头。

      【讨论】:

      • 预编译的头文件是个好主意,但在这种情况下,自己定义它并不是更独立于平台——请查看我在原始问题中的编辑。谢谢!
      【解决方案6】:

      你为什么不定义返回int的函数呢?这是一种高度可移植的类型,并且将您的代码与 邪恶帝国Microsoft 完全分离。

      【讨论】:

      • 用“微软”替换“邪恶帝国”与 SO 有什么关系?
      • 我已经澄清了我的问题以解释为什么在这种情况下,我需要返回 Windows 的 DWORD 想法。无论如何谢谢:)
      【解决方案7】:

      不要使用 DWORD。我见过太多后来移植到其他平台的 Windows 代码。当每个人都有自己的定义时,这些 DWORD 就成为一个真正的问题。我认为没有任何充分的理由在界面中使用特定于 Windows 的类型。

      即使您的代码永远不会被移植到任何其他平台,我仍然认为代码应该使用本机类型或您自己的类型(例如,MyInt32、MyUInt64 等),但 windows.h 中没有。

      【讨论】:

      • 我已经澄清了我的问题以解释为什么在这种情况下,我需要返回 Windows 的 DWORD 想法。无论如何谢谢:)
      【解决方案8】:

      如果你担心当你的跨平台程序在 Windows 上运行时它会加载太多的 Windows DLL,因为你的源代码有 #include ,我认为你担心太多了。甚至记事本也必须加载已知宇宙的一半,并且已知它有时会加载和执行。

      如果您担心当其他开发人员使用 Windows 时,您的跨平台 .h 文件会在他们的编译环境中造成大量命名空间污染,我认为您担心太多了。 99.999% 的 Windows 项目在进入您的 .h 文件之前已经执行了#include

      【讨论】:

      • 不会加载 DLL,因为我包含了一个头文件,所以这不是我担心的。如果可能的话,我只是想要一个更轻量级的头文件来减少编译时间。我将尝试打开预编译头文件,希望不会与 CMake 构建系统产生任何负面影响。
      【解决方案9】:

      你在哪里有 吗?因为在里面,我看到了:

      #ifndef _DWORD_DEFINED
      #define _DWORD_DEFINED
      typedef unsigned long DWORD;
      
      #endif // !_DWORD_DEFINED
      

      此文件位于此处的“...\VC98\INCLUDE”下.. 用于 VC6,所以我想它会在以后的版本中。

      我追求与 OP 相同的事情,并通过包含上述标题来解决它。

      【讨论】:

      • 有趣!那个特定的typedef 似乎被包裹在一个#ifdef !defined(_WIN32) && !defined(_MPPC_) 中,它被注释为“以下代码仅适用于Win16”。所以我很惊讶它对你有用......?
      • 嗯.. 快速测试表明确实定义了_WIN32,但没有定义_MPPC_.. 我找不到有关此宏的任何有用信息,所以我不知道它是什么。 . 可移植性可能是一个问题,ymmv,但尽管有评论,但它在这里仍然有效。我还注意到该评论后面的行是另一个级别的包装,它带有评论 如果不包含在 3.1 标题中,则 #ifndef WINAPI .,但除非包含 ,否则此处未定义 WINAPI
      【解决方案10】:

      怎么样 - #include <minwindef.h>

      【讨论】:

      • 你试过了吗? (也就是说,成功编译了一个包含#includes 并包含例如sizeof(DWORD) 的短程序。)谷歌搜索建议它#defines 是一个max 宏,这很烦人,但如果可以打开它就不会破坏交易关闭!
      猜你喜欢
      • 2011-06-26
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多