解决 typedef void * POINTER_64 PVOID64; 问题

本文解决了一个特定的编译错误,即在使用Visual Studio 2005编译过程中出现的与POINTER_64和PVOID64相关的错误。通过调整include路径顺序或定义POINTER_64为__ptr64,可以有效解决winnt.h文件中出现的语法错误。

解决 typedef void * POINTER_64 PVOID64; 问题:

生成日志 生成 已启动: 项目: sssa,配置: Debug|Win32
命令行 正在创建临时文件“f:\我的引擎库\sssa\sssa\Debug\RSP00000521364016.rsp”,其内容为
[
/Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Gm /EHsc /RTC1 /MTd /Yu"stdafx.h" /Fp"Debug\sssa.pch" /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /c /Wp64 /ZI /TP .\sssa.cpp
]
正在创建命令行“cl.exe @f:\我的引擎库\sssa\sssa\Debug\RSP00000521364016.rsp /nologo /errorReport:prompt”
正在创建临时文件“f:\我的引擎库\sssa\sssa\Debug\RSP00000621364016.rsp”,其内容为
[
/Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Gm /EHsc /RTC1 /MTd /Yc"stdafx.h" /Fp"Debug\sssa.pch" /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /c /Wp64 /ZI /TP .\stdafx.cpp
]
正在创建命令行“cl.exe @f:\我的引擎库\sssa\sssa\Debug\RSP00000621364016.rsp /nologo /errorReport:prompt”
输出窗口 正在编译...
stdafx.cpp
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h(222) : error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h(222) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h(5940) : error C2146: 语法错误 : 缺少“;”(在标识符“Buffer”的前面)
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h(5940) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h(5940) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
结果 生成日志保存在“file://f:\我的引擎库\sssa\sssa\Debug\BuildLog.htm”
sssa - 5 个错误,0 个警告

 

解决方案:

Solution 1.
工具->选项->项目和解决方案->vc++目录
试试调换一下include的次序

不过估计一样
建议下载platformSDK,并安装,而不是使用2005自带psdk
个人意见,可能有错


Solution 2.
typedef void *PVOID;
typedef void * POINTER_64 PVOID64;
在它之前加下:
#define POINTER_64 __ptr64

转载于:https://www.cnblogs.com/cxun/archive/2007/04/28/731486.html

<think>嗯,用户的问题是关于C语言中如何用typedef定义一个指向设备类型的void指针的自定义类型,具体名称是r_drw2d_Device_t。首先,我需要回顾一下typedef和指针的基本用法,尤其是void指针的定义方式。 根据引用[1]中的例子,像typedef unsigned int *PUINT; 这里PUINT被定义为指向unsigned int的指针类型。类似地,如果用户想要定义一个指向void指针的类型,可能需要类似的结构。不过用户提到的是指向设备类型的指针,而设备类型可能是一个结构体或者其他类型,但用户这里用了void指针,所以可能需要先定义设备类型,然后用typedef来创建指针类型。 不过用户的问题里提到“typedef void指针 自定义类型 r_drw2d_Device_t”,这里可能存在歧义。因为void指针通常写作void*,而如果直接typedef void* r_drw2d_Device_t,那这个类型就是一个void指针。但用户可能需要的是指向设备类型的指针,而设备类型可能是一个结构体,比如: typedef struct r_drw2d_Device *r_drw2d_Device_t; 但用户特别提到是void指针,所以可能需要将设备类型定义为void,或者可能用户希望用void指针来泛型指向设备结构体。这时候可能需要先声明结构体,然后用typedef定义指针类型。例如: typedef struct r_drw2d_Device r_drw2d_Device; typedef r_drw2d_Device *r_drw2d_Device_t; 或者如果设备类型的具体结构不重要,可以简化为: typedef void r_drw2d_Device; typedef r_drw2d_Device *r_drw2d_Device_t; 这样,r_drw2d_Device_t就是一个指向void类型(实际上是结构体r_drw2d_Device)的指针类型。或者,如果用户希望直接使用void指针,可能可以这样: typedef void *r_drw2d_Device_t; 这样r_drw2d_Device_t就是一个void指针类型,可以用来指向任何类型的设备结构体,但这样可能失去类型检查的好处。 需要参考用户提供的引用内容,特别是引用[3]和[4]中关于函数指针的typedef用法,但这里用户的问题是关于普通指针而非函数指针。根据引用[1]中的例子,定义指针类型的typedef通常是typedef类型 *新类型名。例如,typedef int *PINT; 所以对于void指针,应该是typedef void *PVOID; 但用户想要的是r_drw2d_Device_t作为指针类型,指向设备类型。如果设备类型是一个结构体,可能需要先定义结构体,再定义指针类型。 可能的正确步骤是: 1. 定义设备类型结构体,可能是不透明类型,所以只声明结构体而不定义其内容。 2. 使用typedef为该结构体指针定义别名r_drw2d_Device_t。 例如: typedef struct r_drw2d_Device r_drw2d_Device; typedef r_drw2d_Device *r_drw2d_Device_t; 这样,r_drw2d_Device_t就是指向结构体r_drw2d_Device的指针类型。但如果用户希望直接使用void指针,可能需要不同的处理方式。可能用户有误解,或者希望用void*来隐藏结构体的细节,这种情况下可能需要: typedef void r_drw2d_Device; typedef r_drw2d_Device *r_drw2d_Device_t; 但这样,r_drw2d_Device实际上是一个void类型,而指针类型就是void*,这可能不太合适。另一种方式是结构体前向声明,保持类型安全: struct r_drw2d_Device; typedef struct r_drw2d_Device *r_drw2d_Device_t; 这样,r_drw2d_Device_t是一个指向不完整结构体的指针,可以在头文件中隐藏具体实现,这是常见的做法。 总结,用户可能需要的是定义一个指向设备结构体的指针类型,而设备结构体可能是不透明的,所以正确的typedef应该是先声明结构体,然后定义指针类型。如果用户确实想用void指针,那直接typedef void* r_drw2d_Device_t; 但这样可能不如使用不透明结构体指针类型安全。</think>根据需求定义指向设备类型的指针变量,推荐使用结构体指针的不透明类型定义方式。以下是具体实现步骤: ### 分步说明 1. **声明设备结构体**(前向声明不暴露实现细节): ```c typedef struct r_drw2d_Device r_drw2d_Device; ``` 2. **定义设备指针类型**: ```c typedef r_drw2d_Device* r_drw2d_Device_t; // 后缀_t表示自定义类型 ``` ### 完整示例 ```c // 声明设备类型(不透明结构体) typedef struct r_drw2d_Device r_drw2d_Device; // 定义设备指针类型 typedef r_drw2d_Device* r_drw2d_Device_t; // 使用示例 r_drw2d_Device_t device_handle = NULL; // 声明设备指针变量 ``` ### 关键点解析 1. **不透明指针**:通过前向声明`struct r_drw2d_Device`隐藏数据结构细节,提升模块化程度[^1] 2. **命名规范**:类型后缀`_t`是POSIX标准推荐的自定义类型命名方式 3. **类型安全**:相比`void*`,专用指针类型可增强编译器类型检查能力 ### 与void指针对比 | 类型 | 优点 | 缺点 | |----------------------|--------------------------|-----------------------| | `r_drw2d_Device_t` | 类型安全,明确语义 | 需要前向声明结构体 | | `void*` | 无需声明类型 | 失去类型安全检查 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值