我正在使用 Qt 编写软件。我的任务之一是判断Windows操作系统是32位还是64位,然后根据这个事实进行以下操作。
但是,当我尝试“ QSysInfo::WordSize ”时,它总是返回 32 而我实际上是在 Windows 7-64 位操作系统上运行。我也试过
#ifdef _WIN32
return 32;
#elif _WIN64
return 64;
这也返回 32。
实际上 Qt 在我的系统中是 32 位的。那是问题吗?如何获得 Windows 的实际字长?
谢谢
我正在使用 Qt 编写软件。我的任务之一是判断Windows操作系统是32位还是64位,然后根据这个事实进行以下操作。
但是,当我尝试“ QSysInfo::WordSize ”时,它总是返回 32 而我实际上是在 Windows 7-64 位操作系统上运行。我也试过
#ifdef _WIN32
return 32;
#elif _WIN64
return 64;
这也返回 32。
实际上 Qt 在我的系统中是 32 位的。那是问题吗?如何获得 Windows 的实际字长?
谢谢
我个人会打电话GetNativeSystemInfo检查该wProcessorArchitecture字段的值。
和宏_WIN32与_WIN64所有宏一样,在编译时进行评估。它们告诉您可执行文件的体系结构,而不是运行可执行文件的系统体系结构。后面的信息,即您想要的信息,只能在运行时确定。
QSysInfo::WordSize 仅告诉您应用程序是在 32 位平台还是 64 位平台上编译的。所以,是的,以某种方式使用 32 位 Qt 编译将返回 32 的字长。
对于您的情况,您可能需要检查IsWow64Process。
这应该适用于任何不使用“段寄存器”(IOW,具有适当平坦的内存空间)的系统上的任何 c++ 环境,包括 Qt 的:
uint32_t archwidth = sizeof(int *); // arch width in bytes
uint32_t archbits = 8 * archwidth; // arch width in bits
这里的机制是:
在 64 位架构(如 XEON)上,CPU 将使用 8 字节(64 位)指针,因此archwidth将返回8;然后archbits是8*8或64。
在 32 位架构(如 68000)上,CPU 将使用 4 字节(32 位)指针,因此archwidth将返回4;然后archbits是4*8或32。
在 16 位架构(如 6809)上,CPU 将使用 2 字节(16 位)指针,因此archwidth将返回2;然后archbits是2*8或16。
您可以使用Q_PROCESSOR_WORDSIZE(或此处)。我很惊讶它没有记录,因为它不在私有标头(QtGlobal)中并且非常方便。
对于某些用例,它可能更可取,因为它不依赖于处理器架构。(例如,它对 x86_64 以及 arm64 和许多其他的定义方式相同)
例子:
#include <QtGlobal>
#include <QDebug>
int main() {
#if Q_PROCESSOR_WORDSIZE == 4
qDebug() << "32-bit executable";
#elif Q_PROCESSOR_WORDSIZE == 8
qDebug() << "64-bit executable";
#else
qDebug() << "Processor with unexpected word size";
#endif
}
甚至更好:
int main() {
qDebug() << QStringLiteral("%1-bit executable").arg(Q_PROCESSOR_WORDSIZE * 8);
}