我看过一个函数,它的原型是:
int myfunc(void** ppt)此函数以a= myfunc(mystruct **var1)的形式在C文件中调用;
其中mystruct是我们所拥有的结构之一的类型--胡枝子。
这在MSVC6.0中不存在任何编译错误,但是当我用其他C编译器编译它时,它会在调用此函数的地方出现一个错误,并带有错误消息:
类型mystruct **的参数与void **类型的参数不兼容
myfunc()的参数保持为void**,因为它似乎是一种泛型malloc类型的函数,用于调用不同的结构变量类型来分配内存。
mystruct**,但是它没有工作-AD
发布于 2008-10-29 10:03:33
void**是有效的,但是,根据您的错误消息,您可能必须显式地将参数转换为如下:
mystruct **var1;
x = myfunc ((void**) var1);这是因为myfunc函数需要void**类型。虽然void*可以隐式转换到任何其他指针,但对于双指针则不是这样--您需要显式地转换它。
发布于 2008-10-30 15:51:31
常见问题解答在问题4.9中详细解决了这个问题。简而言之,他们说--严格地说不是可移植的--可以将任意的指针指向void **;他们接着解释说,“像这样的代码可能会工作,有时也会被推荐,但是它依赖于所有指针类型具有相同的内部表示(这是常见的,但不是通用的)。”他们接着解释说,“您所使用的任何void **值都必须是某个实际void *值的地址;像(void **)&dp这样的强制转换虽然可能会使编译器关闭,但是不可移植的(甚至可能不做您想做的事情)。”
因此,您可以使用以下代码安全地/可移植地实现所需的行为:
some_type *var1 = foo();
void *tmp_void_ptr = (void *)var1;
myfunc(&tmp_void_ptr);发布于 2008-10-29 10:44:15
编译器不能自动从mystruct**转换到void**是有原因的。
考虑以下代码:
void stupid(struct mystruct **a, struct myotherstruct **b)
{
void **x = (void **)a;
*x = *b;
}编译器不会抱怨从myotherstruct*到void*在*x = *b行中的隐式转换,即使该行试图将指向myotherstruct的指针放在只应该放置指向mystruct的指针的位置。
实际上,在前面的一行中,错误是将“指针转换为可以将指向mystruct的指针放置的位置”转换为“指向指向任何东西的指针的位置的指针”。这就是没有隐式强制转换的原因。当然,当您使用显式强制转换时,编译器假定您知道您在做什么。
https://stackoverflow.com/questions/246280
复制相似问题