"const LPVOID"是否等同于"void*const"?

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 LPVOIDLPCVOID.

我应该把每个地方都const LPVOID视为真正含义的地方LPCVOID吗?(因此添加演员是安全的)

进一步澄清:const LPVOID pBlock在这种情况下,这似乎确实是一个错误.Windows 2008的SDK它替换到LPCVOIDVerQueryValue签名.很久以前,葡萄酒就这么做了.

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 *pconst void- 所以base-type *p是const限定的void,但指针本身不合格.在的情况下,const LPVOID p然而,声明-指示符指定一个const合格LPVOID-这意味着指针类型本身是合格的,使得参数声明相同void *const p.

  • tommieb75:`const int`和`int const`在C和C++中是100%相同的,就像`const int*`和`int const*`. (2认同)