如果是这样,为什么一些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
签名.很久以前,葡萄酒就这么做了.
我的问题非常接近这个问题: 你如何声明一个const数组的函数指针?
我成功地在我的包含文件中创建了静态const函数指针数组.
void fun1( void* );
void fun2( void* );
typedef void ( *funPointer )( void* );
funPointer myFunPointer[2] = { &fun1, &fun2 };
Run Code Online (Sandbox Code Playgroud)
现在我发现了以下内容:我的编译器(gcc 4.6.3)抱怨我
(1)编译包含此头文件的不同*.o文件,然后将它们链接在一起(多重定义) - 它有助于在数组的声明中使用static关键字(编辑:实际上函数必须声明为static).
(2)编译包含头部的文件,而不是设置数组const.(myFunPointer声明但未使用)
static const myFunPointer[2] ....
Run Code Online (Sandbox Code Playgroud)
抓住错误/警告.
现在的问题是:我可以解释前一种行为,因为静态使用"预定义"的内存地址,并且函数的几个声明将在地址处合并.这个解释是否正确?如何解释const声明警告的缺失?这是编译器自动删除文件不必要部分的能力吗?