我正在使用Qt编写软件。我的任务之一是判断Windows操作系统是32位还是64位,然后根据这一事实进行以下操作。
然而,当我尝试“ QSysInfo :: WordSize ”时,它总是返回32,而我实际上是在Windows 7-64位操作系统上运行。 我也试过
#ifdef _WIN32
return 32;
#elif _WIN64
return 64;
这也会返回32。
实际上Qt在我的系统中是32位。那是问题吗? 如何获得Windows的实际字大小?
由于
答案 0 :(得分:2)
我个人会致电GetNativeSystemInfo
并检查wProcessorArchitecture
字段的值。
与所有宏一样,_WIN32
和_WIN64
宏在编译时进行评估。它们告诉您可执行文件的体系结构,而不是运行可执行文件的系统的体系结构。后一种信息,即您想要的信息,只能在运行时确定。
答案 1 :(得分:1)
QSysInfo :: WordSize仅告诉您应用程序是否在32位平台或64位平台上已编译。所以,是的,在使用32位Qt编译的方式中,将返回32的字大小。
对于您的情况,您可能需要查看 IsWow64Process 。
答案 2 :(得分:0)
这应该在任何不使用“段寄存器”(IOW,具有适当的内存空间)的系统上,包括Qt在内的任何c ++环境中都可以工作:
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 。
答案 3 :(得分:-1)
您可以使用curried(或Q_PROCESSOR_WORDSIZE)。我很惊讶它没有记录,因为它不在私有标头(QtGlobal)中,并且非常方便。
在某些用例中,它可能更可取,因为它不依赖于处理器体系结构。 (例如,对于x86_64以及arm64等,它的定义方式相同)
示例:
names.stream().forEach(createReportCurry.apply(designation))
甚至更好:
#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
}