我有以下代码:
HANDLE h = NULL;
init(h);
dosomething(h);
如何在init函数中设置“h”以便在dosomething函数中使用它?
答案 0 :(得分:3)
当C传递值时,您需要将h
的地址传递给init()
:
void init(HANDLE* a_h)
{
*a_h = ...; /* some handle. */
}
并调用:
init(&h);
if (h)
{
dosomething(h);
CloseHandle(h);
}
除了将HANDLE
的地址传递给init()
之外,根据无法获取HANDLE
时所需的操作,您还可以传递DWORD
的地址1}}如果未能将此信息提供给调用者,则存储最后一个错误:
void init(HANDLE* a_h, DWORD* a_last_error)
{
*a_h = /* code to acquire handle. */;
if (NULL == *a_h) *a_last_error = GetLastError();
}
答案 1 :(得分:2)
除了传递许多建议的地址外,我还建议从函数中返回句柄。它使代码更清晰:
HANDLE h = init();
答案 2 :(得分:0)
您必须传递句柄的地址,而不是句柄本身。查看按引用调用和按值调用。您目前正在按值进行调用,因此init()
所做的任何更改都只是本地更改。
你想要的是:
void init(HANDLE *h)
{
*h = something;
}
....
...
HANDLE H=NULL;
init(&h);
答案 3 :(得分:0)
致电init(&h)
而非init(h)
将init
定义为
void init(HANDLE * h)
{ /* do whatever */ }
然后,主要内容也会显示更改。
另外一个小注意事项:您可能需要将HANDLE
的指针/地址传递给dosomething()
(取决于您希望在那里完成的内容)
答案 4 :(得分:0)
阐述早期的答案。要使用数据隐藏,您需要将句柄定义为实现之外的void指针和内部的实际结构,因此只有实现才能看到结构的构成。
在您的标头文件中:
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);
不要忘记包含您的头文件。