C++ typedef指向指针的类型

C++ typedef指向指针的类型,c++,pointers,typedef,C++,Pointers,Typedef,所以,通常我们将typedef指向另一个类型或函数指针,但我对typedef指向指针的类型很陌生。例如,在winnt.h中,我们得到: typedef void *HANDLE; typedef PVOID HANDLE; PVOID是: typedef void *PVOID,*LPVOID; 因此,在第一条语句中,它必须是*HANDLE,因为它是指向void的指针,而PVOID已经是指向void的指针,因此不需要将它声明为指针 但是,typedef将类型定义为指针有什么好处?不是更让人困

所以,通常我们将typedef指向另一个类型或函数指针,但我对typedef指向指针的类型很陌生。例如,在winnt.h中,我们得到:

typedef void *HANDLE;
typedef PVOID HANDLE;
PVOID是:

typedef void *PVOID,*LPVOID;
因此,在第一条语句中,它必须是*HANDLE,因为它是指向void的指针,而PVOID已经是指向void的指针,因此不需要将它声明为指针

但是,typedef将类型定义为指针有什么好处?不是更让人困惑吗?

说英语

typedef void *PVOID
表示使用void*而不是PVOID&

typedef PVOID HANDLE;
意味着使用PVOID而不是HANDLE&由于我们以前的typedef,这进一步意味着 使用void*代替HANDLE

这是为了提高代码的可读性

typedef将类型定义为指针有什么好处?这不是更令人困惑吗

通常,模块/库需要维护一些内部状态才能正常运行。需要在为此模块/库调用的每个api上读取/验证此内部状态。因此,模块的用户需要将此信息传递给他们调用的每个api。但是库的实现者不希望库的用户能够看到这个维护状态的内容,因为如果允许他们这样做,可能会有人恶作剧或诚实地模仿修改状态,这可能会对模块造成严重的后果。为了避免这种情况,模块将其状态维护变量屏蔽为一个
void*
,因此现在它对模块用户是不透明的(其内容不可见)。为了让用户不会对使用
void*
感到困惑,他们通常将
void*
键入为
HANDLE
,这是为了便于模块/库的客户端使用

至于上述守则:

typedef void *PVOID,*LPVOID;
表示无论您在何处提及
PVOID
,此后它都将被视为
void*
类型。
所以在

相当于:

typedef void *HANDLE; 

因为
PVOID
只不过是
void*

如果你想知道为什么要对同一个值使用两个typedef,答案是:它们有不同的含义和用例。句柄是对象的句柄,PVOID只是指向任何类型的指针。因此,这只是为了更好的可读性。

我看不出这比向前声明一个不透明结构(如
类句柄)有什么好处。这样可以更好地防止意外误用。或者我遗漏了什么?比如说C API呢?;)那么,typedef void*句柄与typedef void*句柄相同吗?嗯,我知道这一点,但这一点对我来说很奇怪。@MichaelAnderson:答案是为什么会这样做,它并不是说它应该是这样做的。这是传统的C方式。而遗留代码有时也会以同样的方式使用。我同意向前声明类是更好的方式,但这并不总是传统的过程C++中间件/应用程序所做的。是的,过程C++ C++中间件存在,并且是一个严峻的问题。现实。@MichaelAnderson:A
句柄可以指向很多不同的结构。它几乎用于WIN32(以及WIN16)API中的所有内容。
typedef void *HANDLE;