【问题标题】:How to detect if the Windows DWORD_PTR type is supported, using an ifdef?如何使用 ifdef 检测是否支持 Windows DWORD_PTR 类型?
【发布时间】:2011-02-12 23:25:56
【问题描述】:

Windows API 中有some new integer types 支持Win64。它们并不总是得到支持;例如they aren't present in MSVC6.

如何编写#if 条件来检测<windows.h> 是否支持这些类型?

(我的代码需要在许多不同版本的 Microsoft Visual C++ 下编译,包括 MSVC6。所以我需要提供我自己对这些类型的定义,并带有 #if 以在较新的编译器中禁用它们)。

(对于搜索者,完整的类型列表为:DWORD_PTR、INT_PTR、LONG_PTR、UINT_PTR、ULONG_PTR)

【问题讨论】:

    标签: c++ c windows visual-c++ win64


    【解决方案1】:

    MSC_VER 是 MSVC 6 的 [1200, 1300) 范围内的值。因此您可以使用 #if MSC_VER>=1200 && MSC_VER<1300

    编辑:正如安德斯所说,除了“我的编译器 MSVC 6”之外,这并不是真正有效的测试。但是,您也可以使用:

    #if defined(MAXULONG_PTR)
    

    由于DWORD_PTR 是一个值类型,它在basetsd.h 中定义了一个最大值。

    【讨论】:

    • 仅仅因为编译器是 VC6 并不意味着这些类型没有定义,通常你会使用 VC6 以及一些最新的平台 sdk
    • Anders 的评论应该是公认的答案,更新您的平台 sdk,不要尝试围绕它的过时版本编写代码。
    • Blindy:我们将源代码发送给客户。如果我们声称支持 VC6,我们的代码需要正常工作。需要较新的平台 SDK 会导致没有它或未正确配置它的人的支持电话。这会惹恼客户,花费他们时间(== 由于延迟产品而导致的销售损失)和金钱,并且花费我们时间和金钱来做出响应。我们可以只说“需要VC2003”,因为这是一条足够简单的信息,人们可以理解。我们最终会这样做……但还没有。
    【解决方案2】:

    由于这些类型是 typedef,因此没有一种可靠的方法来确定它们是否在预处理器阶段定义。 MSN 关于测试编译器版本的建议非常好,但正如 Anders 在评论中指出的那样,可能正在使用更新的 SDK(我认为 VC6 已通过 2003 SDK 得到支持 - 我不确定这些类型是否在其中SDK 与否)。

    您可以检查 SDK 确实定义为使用这些类型的宏的内容,例如 GetWindowLongPtr

    #if !defined( GetWindowLongPtr)
    typedef DWORD DWORD_PTR;
    #endif
    

    Kludgy,但我认为你可能会被 kludgy 卡住。

    【讨论】:

    • 我打算建议 #ifdef 检查 UintToPtr 宏,它似乎是在我的 2003 平台 sdk 中定义的,但不是旧的 vc6 头文件,但 GWLP 更酷。我不确定 GWLP 是否是 x64 上的宏,因此可能需要 !_WIN64 检查,或者您可以检查 GWLP_* 定义。
    • 或 MAXULONG_PTR。因为没有它你就没有 DWORD_PTR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多