2012-12-11 2 views
0

Я использую MinGW GCC компилятор на Windows 7. Я пытаюсь скомпилировать источник, содержащий следующий код:MinGW GCC Не распознает MEMSTATUSEX?

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

Я уверен, что вы можете догадаться, этот код просто получает доступную память с помощью MEMORYSTATUSEX struct, возвращаемая GlobalMemoryStatusEx.

Когда я пытаюсь скомпилировать, я получаю эту ошибку:

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, оба имеют одинаковые минимальные требования к версии клиента:

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

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

Есть ли какой-нибудь компилятор флаг мне нужно установить? Или у кого-нибудь есть другие решения?

Заранее благодарим за вашу помощь!

+3

Вы, должно быть, заметили #if для _WIN32_WINNT прямо над ним. К чему вы это настроили? http://msdn.microsoft.com/en-us/library/6sehtctf%28v=vs.90%29.aspx –

+0

Я ничего не задал ... – bgroenks

+0

О, хорошо. Я определил его, и это остановило его. Спасибо. – bgroenks

ответ

0

Очевидно, вы должны определить _WIN32_WINNT самостоятельно либо как флаг компилятора, либо инструкцию определения в одном из ваших файлов заголовка/источника, чтобы эта функция функционировала должным образом.

Добавление #define _WIN32_WINNT 0x0500 позволит коду компилироваться нормально.

2

До включения 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 
Смежные вопросы