代码之家  ›  专栏  ›  技术社区  ›  j_random_hacker

定义DWORD时,可以包含的最小Windows头是什么?

  •  11
  • j_random_hacker  · 技术社区  · 14 年前

    我有一个自己的小头文件,它声明了两个函数,其中一个函数的返回类型是 DWORD . 我不愿意拖进去 windows.h 只是为了得到这种类型的正式定义,因为这个文件很大,我的头将被用在一些不需要它的源模块中。

    当然,实际上我知道 双字 只是 unsigned int ,但如果可能的话,我更希望使用更卫生的方法来包含官方头文件。

    this page 上面写着 双字 定义于 windef.h ,但不幸的是,仅包含这个小文件会直接导致编译错误——显然它希望被其他头包含。(另外,我的文件是头文件这一事实也意味着我不能只声明 WIN32_LEAN_AND_MEAN ,因为包含我的文件的源文件可能需要保持未定义状态。)

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

    [编辑] 谢谢你的回复。对于那些建议使用不同类型的人,让我解释一下为什么在这种情况下不需要这样做:我在不同的源文件中设置了这两个函数的不同平台特定版本,并要求cmake配置检测当前平台并选择要构建的平台。在Windows上,我的功能如下:

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

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

    10 回复  |  直到 14 年前
        1
  •  5
  •   Todd    14 年前

    我相信你以前可以包括winbase.h,但现在似乎不是这样了。我看过的所有资料都推荐windows.h,可以选择win32'u lean'u和'u mean。正如您所指出的,后一种优化对您没有帮助。

    你可以这样做。

    #ifndef _WINDEF_
    typedef unsigned long DWORD;
    #endif
    

    不干净,但有效率。这个typedef不太可能改变。

        2
  •  4
  •   Aram Hăvărneanu    14 年前

    包括windows.h并使用预编译头。顺便说一句,您可以定义win32_lean_和_mean,然后稍后取消定义!

        3
  •  3
  •   tomlogic    14 年前

    DWORD 总是32位无符号整数,所以是否使用 双字 unsigned long uint32_t . 如果这三种类型都引用32位无符号整数,编译器将认为它们是等价的。

    因为这是特定于平台的文件的一部分,所以我认为您不必太担心可移植性。见鬼,在标题中查找 双字 把typedef放在标题里。C编译器接受重复的typedef,只要它们具有相同的基础类型。

        4
  •  3
  •   joexxx    9 年前

    Use this file: include <IntSafe.h>

        5
  •  2
  •   Javier    14 年前

    我想你自己给它下个定义。这样,它更独立于平台(当然,我不知道其他代码是否需要windows)。如果不想这样做,请使用预编译头。

        6
  •  1
  •   wallyk    14 年前

    为什么不定义要返回的函数 int ?这是一种高度可移植的类型,完全脱离了 邪恶帝国 微软。

        7
  •  1
  •   Tuomas Pelkonen    14 年前

    不要使用双字。我看到过太多的windows代码后来被移植到其他平台上。当每个人都有自己的定义时,这些词就成了一个真正的问题。我不认为有任何理由在界面中使用windows特定类型。

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

        8
  •  1
  •   Windows programmer    14 年前

    如果你担心当你的跨平台程序在windows上运行时,仅仅因为你的源代码包含了windows.h>,它就会加载太多的windows dll,我认为你太担心了。即使是记事本也必须加载已知宇宙的一半,而且它有时也会加载和执行。

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

        9
  •  1
  •   antak Jason    12 年前

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

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

    此文件位于“…\VC98\include”下面。这是VC6的,所以我想它会在以后的版本中。

    我也在追求同样的事情,作为操作和解决它包括所说的头球。

        10
  •  0
  •   Abhishek Jain    7 年前

    怎么样— #include <minwindef.h> ?