0

我有以下代码:

    HANDLE h = NULL;
    init(h);
    dosomething(h);

如何在 init 函数中设置“h”以便在 dosomething 函数中使用它?

4

5 回答 5

3

您需要将 to 的地址传递hinit()C 通过值传递:

void init(HANDLE* a_h)
{
    *a_h = ...; /* some handle. */
}

并调用:

init(&h);
if (h)
{
    dosomething(h);
    CloseHandle(h);
}

除了传递HANDLEinto的地址之外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();
}
于 2012-10-08T13:52:12.560 回答
2

除了像许多人建议的那样传递地址外,我还建议从函数中返回句柄。它使代码更简洁:

HANDLE h = init();
于 2012-10-08T14:01:06.380 回答
0

调用init(&h)而不是init(h)

并定义init

void init(HANDLE * h)
{ /* do whatever */ }

然后这些更改也将在主中可见。

还有一个小提示:您可能需要将指针/地​​址传递HANDLEdosomething()太(取决于您想要在那里完成的任务)

于 2012-10-08T13:56:39.523 回答
0

详细说明之前的答案。要使用数据隐藏,您需要将句柄定义为实现外部的空指针和内部的真实结构,因此只有实现才能看到结构的构成。

在你的头文件中:

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

不要忘记包含您的头文件。

于 2012-10-08T14:44:16.837 回答
0

您必须传递句柄的地址,而不是句柄本身。查看引用调用和值调用。您当前正在按值调用,因此所做的任何更改init()都是本地的。

你想要的是这样的:

void init(HANDLE *h)
{
    *h = something;
}

....

    ...
    HANDLE H=NULL;
    init(&h);
于 2012-10-08T13:51:36.977 回答