gpt4 book ai didi

winapi - Windows API 中的 LONGLONG 数据类型

转载 作者:行者123 更新时间:2023-12-05 01:29:35 25 4
gpt4 key购买 nike

根据 this MSDN 页面,数据类型 LONGLONG 定义如下。

#if !defined(_M_IX86)
typedef __int64 LONGLONG;
#else
typedef double LONGLONG;
#endif

它说 LONGLONG 是一个 64 位有符号整数。但是double是浮点型,不是整型。那么,我发现错字了吗?还是我漏掉了一点?

最佳答案

这是一个文档错误。它看起来是从源代码到文档的有损转换1winnt.h 中的实际定义要复杂一些:

//
// __int64 is only supported by 2.0 and later midl.
// __midl is set by the 2.0 midl and not by 1.0 midl.
//

#define _ULONGLONG_
#if (!defined (_MAC) && (!defined(MIDL_PASS) || defined(__midl)) && (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)))
typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG;

#define MAXLONGLONG (0x7fffffffffffffff)


#else

#if defined(_MAC) && defined(_MAC_INT_64)
typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG;

#define MAXLONGLONG (0x7fffffffffffffff)


#else
typedef double LONGLONG;
typedef double ULONGLONG;
#endif //_MAC and int64

#endif

要了解发生了什么,让我们通过删除所有不直接相关的内容来简化它。

  • 假设 defined(_MAC) 的计算结果为 0。
  • 假设 defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64 的计算结果为 1。appears to be true甚至可以追溯到 Visual C++ 6.0。
  • 去除此处不相关的符号(_ULONGLONG_ULONGLONGMAXLONGLONG)。
  • 在不改变任何其他语义的情况下应用缩进。

定义现在更容易解析:

//
// __int64 is only supported by 2.0 and later midl.
// __midl is set by the 2.0 midl and not by 1.0 midl.
//

#if !defined(MIDL_PASS) || defined(__midl)
typedef __int64 LONGLONG;
#else
typedef double LONGLONG;
#endif

有了它,应该清楚条件是保护 MIDL 编译器(而不是 C++ 编译器)。上面的评论也有道理:MIDL 编译器 2 的第 1 版不支持将 __int64 作为关键字,但第 2 版(及更高版本)支持。

翻译成英文:如果此代码未被 MIDL 编译器解析,或者 MIDL 编译器的版本为 2 或更高版本,则将 LONGLONG 别名为 __int64。否则(即使用 MIDL 编译器版本 1),尽量选择 double

这在今天几乎没有实际用处。您可以假设 LONGLONG__int64 的别名,无论该定义是由 MIDL 还是 C++ 编译器提取的。我找不到 MIDL.exe 的版本历史记录,但我认为版本 1 是“古老的”。


1 我不愿意接受让 .NET 开发人员编写工具以从源代码生成 C 文档是一个好主意™。
2 这是指编译器版本,而不是 MIDL 语言版本。

关于winapi - Windows API 中的 LONGLONG 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67684386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com