EFr*_*aim 10 c++ winapi typedef const-correctness
如果是这样,为什么一些Win32标头使用它?
例如:
BOOL APIENTRY VerQueryValueA( const LPVOID pBlock,
LPSTR lpSubBlock,
LPVOID * lplpBuffer,
PUINT puLen
);
Run Code Online (Sandbox Code Playgroud)
多一点的阐述:如果API从不使用引用(或任何其他C++ -只建),但只有指针和价值观,什么是具有点const LPVOID对LPCVOID.
我应该把每个地方都const LPVOID视为真正含义的地方LPCVOID吗?(因此添加演员是安全的)
进一步澄清:const LPVOID pBlock在这种情况下,这似乎确实是一个错误.Windows 2008的SDK它替换到LPCVOID的VerQueryValue签名.很久以前,葡萄酒就这么做了.
Joh*_*itb 13
typedef-name表示一个类型,而不是一系列标记(宏也是如此).在您的情况下,LPVOID表示也由令牌序列表示的类型void *.所以图表看起来像
// [...] is the type entity, which we cannot express directly.
LPVOID => [void *]
Run Code Online (Sandbox Code Playgroud)
在语义上,如果指定类型const LPVOID,则会得到以下图表(说明符周围的括号表示"说明符所表示的类型"):
// equivalent (think of "const [int]" and "[int] const"):
const LPVOID <=> LPVOID const => const [void *] <=> [void *] const
=> ["const qualified void-pointer"]
Run Code Online (Sandbox Code Playgroud)
这是不是同样的事情,该令牌序列const void *-因为这一个不表示一个const修饰指针类型,而是一个指向一个const限定的类型(的东西指着会是const).
在语法上,参数声明具有以下(简化)形式:
declaration-specifiers declarator
Run Code Online (Sandbox Code Playgroud)
在的情况下声明说明符const void *p是const void- 所以base-type *p是const限定的void,但指针本身不合格.在的情况下,const LPVOID p然而,声明-指示符指定一个const合格LPVOID-这意味着指针类型本身是合格的,使得参数声明相同void *const p.
| 归档时间: |
|
| 查看次数: |
3946 次 |
| 最近记录: |