【发布时间】:2021-10-26 10:12:49
【问题描述】:
我正在传递一个指向我的函数的指针,但是这个指针的类型可能会改变。我不想写这个函数的几个版本,比如func_float()和func_int()。所以我将void* 的指针传递给我的函数,然后将类型转换为int* 或float*,这取决于参数type。这是我的代码:
void func(void* pSrc, float* pDst, int len, int type)
{
if (type == 0)
float* pIn = (float*)pSrc;
else
int* pIn = (int*)pSrc;
float* pOut = pDst;
while (len--)
*pOut++ = (float)*pIn++ * 2.0; // cast to float and then do some math
}
int main()
{
int input[3] = { 1,2,3 };
float output[3] = { 0 };
func(input, output, 3, 1);
return 0;
}
但这似乎行不通。 VS 告诉我a dependent statement may not be a declaration。我试图在if 之前将pIn 声明为void*,但是当我取消引用指针pIn 时出现另一个错误expression must be a pointer to a complete object type。
任何帮助将不胜感激。
【问题讨论】:
-
pIn的声明是if分支和else分支的本地声明,它们在 if/else 之后不存在。您必须在两个分支中的每一个中复制算法。 -
一种方法是创建一个宏来定义您的函数,并将类型作为宏参数(并粘贴标记,因此函数具有唯一的名称
-
在这种特殊情况下,只写 2 个函数会更容易
-
我收到很多其他编译器错误。值得注意的是,您的函数参数类型错误,并且您传递的参数数量不正确。
-
请考虑
(float)根据 *pIn++ 是浮点数还是整数,所做的事情完全不同。机器代码会是什么样子?编译器必须编写两个不同的函数,一个用于浮点,一个用于 int!
标签: c void-pointers