所以,通常我们将typedef设置为另一个类型或函数指针,但是对于指针来说typedef类型对我来说很奇怪。例如,在winnt.h中我们得到了:
typedef void *HANDLE;
typedef PVOID HANDLE;
和PVOID是:
typedef void *PVOID,*LPVOID;
根据它,在第一个语句中它必须是* HANDLE,因为它是一个指向void的指针,而PVOID已经是一个指向void的指针,因此它不需要声明为指针。
但是,将typedef类型指向指针有什么好处?这不是更令人困惑吗?
答案 0 :(得分:6)
将typedef类型指向指针有什么好处?这不是更令人困惑吗?
通常,模块/库需要保持一些内部状态才能正常运行。需要在为此模块/库调用的每个api上读取/验证此内部状态。因此,模块的用户需要将此信息传递给他们调用的每个api。但是库实现者不希望库的用户能够看到这个维护状态的内容,因为如果他们被允许,有人可能会玩恶作剧或者诚实地修改状态,结果可能是这个模块非常激烈。为了避免这种情况,模块将其状态维护变量屏蔽为void*
,以便现在它对模块的用户是不透明的(它的内容是不可见的)。为了让用户不要对使用void *
感到困惑,他们通常会将void *
键入为HANDLE
,这是为了方便模块/库的客户端使用。
至于上述代码:
typedef void *PVOID,*LPVOID;
表示您提及PVOID
的任何地方,此后它将被视为void *
类型。
所以,
typedef PVOID HANDLE;
相当于:
typedef void *HANDLE;
因为PVOID
只是void *
。
答案 1 :(得分:2)
如果你很好奇为什么要使用2个typedef来获得相同的值,答案是:它们具有不同的含义和用例。 HANDLE是对象的句柄,PVOID只是指向任何类型的指针。所以这只是为了更好的可读性。
答案 2 :(得分:0)
用英语说,
typedef void *PVOID
表示使用void *而不是PVOID。 &安培;
typedef PVOID HANDLE;
表示使用PVOID代替HANDLE&由于我们之前的typedef,这进一步意味着 使用void *而不是HANDLE
这是为了提高代码的可读性。