据我所知,我的函数f(void *data[])
应该接收一个通用指针数组作为参数。
尽管如此,当我尝试
size_t *cnt[8];
... // initialize pointers in cnt
f(cnt);
特别是g ++会自动将f
的原型转换为f(void**)
,然后将cnt
转换为size_t**
,而不是说它无法转换size_t**
} void**
。
答案 0 :(得分:0)
g ++会自动将
f
的原型转换为f(void**)
我发现使用精确的术语有助于更好地理解编程语言。将f
转换转换为f(void**)
可能会让人感到困惑。这并非迂腐地说这个案例。f(void *data[])
只是写f(void** data)
的另一种方式。这种替代语法是 syntactic sugar 的一种情况。
转换通常意味着将一种类型更改为另一种类型。您的功能声明中没有涉及转换。
此外,这种语法糖并非特定于编译器g ++。此行为在C ++标准中指定。
f(cnt);
然后它将
cnt
转换为size_t**
这确实是转换。这是一种称为衰减的特殊转换类型。这种隐式转换也是一种语法糖。它在语义上与写作相同:
f(&cnt[0]);
无法将size_t * arg []传递给需要void指针数组的函数
这是正确的。
实际上,您的函数需要void**
,但您传递了函数size_t**
。 size_t**
无法隐式转换为void**
,因此您的程序格式不正确。
解决问题的方法:
1)改为使用f(size_t**)
。
2)首先使用void*
数组
3)将size_t *cnt[8]
复制到另一个数组void *temp[8]
,然后将其传递给该函数。
4)(不推荐)将cnt
投射到void**
并希望它能达到您的功能所期望的效果。
答案 1 :(得分:-1)
C允许从任何类型的指针指针到void
指针到指针的隐式转换,但C ++不允许这样做。您需要明确地将cnt
投射到void **
。