如何在 VC++ 中使用 _W64 和 __w64?

Posted

技术标签:

【中文标题】如何在 VC++ 中使用 _W64 和 __w64?【英文标题】:How do I use _W64 and __w64 in VC++? 【发布时间】:2009-11-06 09:01:55 【问题描述】:

在 Visual C++ 9 中有 __w64 这样的东西。我在尝试将我的原生 C++ DLL 移植到 64 位时遇到了它。特别是在crtdefs.h 有这个不错的sn-p:

#if !defined(_W64)
#if !defined(__midl) && (defined(_X86_) || defined (_M_IX86)) && _MSC_VER >= 1300
#define _W64 __w64
#else
#define _W64
#endif
#endif

如果我理解正确,这意味着对于 64 位,_W64 被定义为空字符串并且没有任何效果,但对于 32 位,它被定义为 __w64

我尝试将 _W64 定义为空字符串,然后依次将 __w64 定义为,并且至少两次项目在 64 位配置中都能正常编译。

也就是说_W64__w64 看起来都没用。我打算如何使用它们以及如何在 64 位项目中定义 _W64

【问题讨论】:

【参考方案1】:

__w64 用于标记在 32 位和 64 位环境中具有不同大小的类型。然后,当您将可能 64 位类型分配给 32 位类型时,编译器可能会发出警告。

如果您将MSDN: __w64 视图切换到最新版本,您可以看到该关键字已被弃用。当您尝试使用 /Wp64 选项进行编译时,VC9 甚至会生成警告。

【讨论】:

【参考方案2】:

答案是,你不知道。这是 32 位编译器使用的编译器功能。最初的想法是微软想让程序员为即将到来的 32->64 位转换做好准备。因此,32 位编译器获得了将某些 typedef 标记为 __w64 的能力。然后,Microsoft 使用该功能标记在 Win64 中会发生变化的 typedef。

【讨论】:

以上是关于如何在 VC++ 中使用 _W64 和 __w64?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ARM 上的 uint64_t 和 poly64_t 之间进行转换?

x86_64-w64-mingw32-gcc.exe:错误:CreateProcess:没有这样的文件或目录

003_STM32程序移植之_W25Q64

php5.5安装及phpmyadmin&nginx配置php模块

Zabbix的安装与配置

无法安装 phpMyAdmin 错误:php71w-common 与 php-common-5.4.16-43.el7_4.1.x86_64 冲突