我有以下代码:
HANDLE h = NULL;
init(h);
dosomething(h);
如何在 init 函数中设置“h”以便在 dosomething 函数中使用它?
您需要将 to 的地址传递h
给init()
C 通过值传递:
void init(HANDLE* a_h)
{
*a_h = ...; /* some handle. */
}
并调用:
init(&h);
if (h)
{
dosomething(h);
CloseHandle(h);
}
除了传递HANDLE
into的地址之外init()
,根据在获取 a 失败时所需的操作HANDLE
,您还可以传递在DWORD
失败时存储最后一个错误的地址,以使调用者可以使用此信息:
void init(HANDLE* a_h, DWORD* a_last_error)
{
*a_h = /* code to acquire handle. */;
if (NULL == *a_h) *a_last_error = GetLastError();
}
除了像许多人建议的那样传递地址外,我还建议从函数中返回句柄。它使代码更简洁:
HANDLE h = init();
调用init(&h)
而不是init(h)
并定义init
为
void init(HANDLE * h)
{ /* do whatever */ }
然后这些更改也将在主中可见。
还有一个小提示:您可能需要将指针/地址传递HANDLE
给dosomething()
太(取决于您想要在那里完成的任务)
详细说明之前的答案。要使用数据隐藏,您需要将句柄定义为实现外部的空指针和内部的真实结构,因此只有实现才能看到结构的构成。
在你的头文件中:
typedef void * HANDLE;
void init(HANDLE *h);
void dosomething(HANDLE h);
void destroy(HANDLE *h);
实施:
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int contents;
} * HANDLE;
void init(HANDLE *h) {
*h = (HANDLE)malloc(sizeof *h);
(*h)->contents = 2;
}
void dosomething(HANDLE h) {
printf("Contents are: %d\n", h->contents);
}
void destroy(HANDLE *h) {
free(*h);
*h = NULL;
}
和调用函数:
HANDLE h = NULL;
init(&h);
dosomething(h);
destroy(&h);
不要忘记包含您的头文件。
您必须传递句柄的地址,而不是句柄本身。查看引用调用和值调用。您当前正在按值调用,因此所做的任何更改init()
都是本地的。
你想要的是这样的:
void init(HANDLE *h)
{
*h = something;
}
....
...
HANDLE H=NULL;
init(&h);