typedef指针的类型

时间:2011-11-01 07:07:49

标签: c++ pointers typedef

所以,通常我们将typedef设置为另一个类型或函数指针,但是对于指针来说typedef类型对我来说很奇怪。例如,在winnt.h中我们得到了:

typedef void *HANDLE;
typedef PVOID HANDLE;

和PVOID是:

typedef void *PVOID,*LPVOID;

根据它,在第一个语句中它必须是* HANDLE,因为它是一个指向void的指针,而PVOID已经是一个指向void的指针,因此它不需要声明为指针。

但是,将typedef类型指向指针有什么好处?这不是更令人困惑吗?

3 个答案:

答案 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

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