Почему мой EnumWindowPro c не скомпилируется в C? - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь написать функцию, которая возвращает HWND из идентификатора процесса, но есть одна небольшая проблема. Я получаю сообщение об ошибке «Ожидается идентификатор». Он будет скомпилирован, только если я удалю & in window_data &data, но тогда функция не будет работать. Почему & нужна в первую очередь? Код компилируется в C ++, но не в C.

typedef struct
{
    DWORD dwProcessID;
    HWND hWnd;
} window_data;

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    window_data &data = *(window_data*)lParam;
    DWORD dwProcessID = 0;

    GetWindowThreadProcessId(hwnd, &dwProcessID);
    if (dwProcessID != data.dwProcessID)
        return TRUE;

    data.hWnd = hwnd;
    return FALSE;
}

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Язык C не поддерживает объявление ссылки на переменные, только C ++ поддерживает, поэтому window_data &data недопустимо.

Если вы хотите сделать это в стандартном C, вы можете вместо этого перейти на приведенную версию указателя:

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    window_data *data = (window_data*)lParam;
    DWORD dwProcessID = 0;

    GetWindowThreadProcessId(hwnd, &dwProcessID);
    if (dwProcessID != data->dwProcessID)
        return TRUE;

    data->hWnd = hwnd;
    return FALSE;
}
0 голосов
/ 09 февраля 2020
window_data &data = *(window_data*)lParam;

В C нет ссылок, как в C ++. Таким образом, вы не можете использовать window_data &data в коде C. По этой причине программа компилируется с помощью компилятора C ++, но не компилятором C.

...