【问题标题】:Why won't my EnumWindowProc compile in C?为什么我的 EnumWindowProc 不能在 C 中编译?
【发布时间】:2020-02-09 07:38:54
【问题描述】:

我正在尝试编写一个从进程 ID 返回 HWND 的函数,但有一个小问题。我收到错误“需要一个标识符”。只有当我删除 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;
}

【问题讨论】:

标签: c++ c windows reference


【解决方案1】:

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;
}

【讨论】:

    【解决方案2】:
    window_data &data = *(window_data*)lParam;
    

    在 C 中没有像在 C++ 中那样的引用。因此,您不能在 C 代码中使用 window_data &data。这就是为什么程序使用 C++ 编译器而不是 C 编译器编译的原因。

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 2012-02-23
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多