C语言中EnumWindowsProc编译失败:标识符错误及引用符号问题
问题解析:C语言不支持C++风格的引用
这个问题的核心是C和C++在引用类型上的语法差异,咱们一步步拆解:
1. 为什么window_data &data在C里编译报错?
window_data &data = *(window_data*)lParam; 里的&是C++的引用声明语法——用来给一个变量起“别名”,修改引用就等同于修改原变量。但C语言根本没有“引用”这个语法特性,C编译器会把这里的&当成取地址运算符,自然就报“expected an identifier”(期望标识符)的错误。
2. 为什么C++里这个写法能正常工作?
在C++中,引用的作用是直接绑定到原对象上,不会产生拷贝。这里data是*(window_data*)lParam的别名,当你找到匹配PID的窗口后,data.hWnd = hwnd;会直接修改调用者传入的那个window_data结构体的内容,所以调用者能拿到正确的HWND。
3. 去掉&后编译通过但功能失效的原因
如果写成window_data data = *(window_data*)lParam;,这是在拷贝原结构体到局部变量data中。之后你修改data.hWnd只是修改这个局部拷贝,调用者传入的原结构体根本不会被改变,所以函数结束后你拿不到正确的HWND,功能自然失效。
4. C语言的正确写法
既然C没有引用,咱们直接用指针来实现同样的效果(直接操作原数据,避免拷贝):
typedef struct { DWORD dwProcessID; HWND hWnd; } window_data; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { // 直接将lParam转换为window_data指针 window_data *data = (window_data*)lParam; DWORD dwProcessID = 0; GetWindowThreadProcessId(hwnd, &dwProcessID); if (dwProcessID != data->dwProcessID) return TRUE; // 通过指针直接修改原结构体的hWnd成员 data->hWnd = hwnd; return FALSE; }
这个写法里,data是指向调用者传入的window_data结构体的指针,所有对data->hWnd的修改都会直接作用在原结构体上,和C++用引用的效果完全一致,同时符合C语言的语法规范。
内容的提问来源于stack exchange,提问作者rahul447
相关产品推荐
相关产品推荐

