【问题标题】:MinGW GCC Not Recognizing MEMSTATUSEX?MinGW GCC 不识别 MEMSTATUSEX?
【发布时间】:2026-02-24 12:05:01
【问题描述】:

我在 Windows 7 上使用 MinGW GCC 编译器。我正在尝试编译包含以下代码的源代码:

MEMORYSTATUSEX mem_stat;
mem_stat.dwLength = sizeof(memstat);
BOOL success = GlobalMemoryStatusEx(mem_stat);
ram_ptr = &(mem_stat->ullAvailPhys);

我相信您可以猜到,这段代码只是使用 GlobalMemoryStatusEx 返回的 MEMORYSTATUSEX 结构获取可用内存。

当我尝试编译时,我得到了这个错误:

error: unknown type name 'MEMORYSTATUSEX'

我查看了 winbase.h(在 MinGW 安装包含文件夹中),猜猜我发现了什么?

#if (_WIN32_WINNT >= 0x0500)
typedef struct _MEMORYSTATUSEX {
    DWORD dwLength;
    DWORD dwMemoryLoad;
    DWORDLONG ullTotalPhys;
    DWORDLONG ullAvailPhys;
    DWORDLONG ullTotalPageFile;
    DWORDLONG ullAvailPageFile;
    DWORDLONG ullTotalVirtual;
    DWORDLONG ullAvailVirtual;
    DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX,*LPMEMORYSTATUSEX;
#endif

所以它就在那里。我猜这与预编译器 if/endif 有关,但我不知道如何解决这个问题....

另外更奇怪的是,如果我改用 MEMORYSTATUS 结构,它就可以正常工作。

根据 MS 文档,两者具有相同的最低客户端版本要求:

内存状态: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589%28v=vs.85%29.aspx

内存状态: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366772%28v=vs.85%29.aspx

我需要设置一些编译器标志吗?或者有人有其他解决方案吗?

提前感谢您的帮助!

【问题讨论】:

  • 你一定注意到了它上面的#if for _WIN32_WINNT。你把它设置成什么? msdn.microsoft.com/en-us/library/6sehtctf%28v=vs.90%29.aspx
  • 我什么都没设置...
  • 哦,好的。我定义了它并阻止了它。谢谢。
  • 您应该将defined it 的方式放在您自己问题的答案中。因此,它超出了未答复的列表。
  • 很公平。我会这样做的。

标签: c api winapi gcc mingw


【解决方案1】:

在包含 Windows.h 之前,添加:

#define WINVER 0x0500

头文件windef.h说:

/*
 * If you need Win32 API features newer the Win95 and WinNT then you must
 * define WINVER before including windows.h or any other method of including
 * the windef.h header.
 */

然后使用 -std=c++11 标志进行编译,例如:

g++ -Wall -std=c++11 -c <yourFile>.cpp -o <yourFile>.o

【讨论】:

    【解决方案2】:

    显然,您必须自己将 _WIN32_WINNT 定义为编译器标志或定义语句在您的头文件/源文件之一中,才能使此特定功能正常工作。

    添加#define _WIN32_WINNT 0x0500将允许代码正常编译。

    【讨论】: