我有一个第三方库,其功能如下所示:
void foo(const void* input, char output[1024]);
如果我写这样的话:
char* input = "Hello";
char output[1024];
foo(input, output); // OK
但我不想在堆栈上声明这么大的数组(在OS内核环境中会非常危险)。所以我必须做这样的事情:
char* input = "Hello";
char* output_buf = new char[1024];
foo(input, output_buf); // Compiler Error C2664
我无法改变foo的实现。我该怎么办?
=================
问题已经解决。我的真实代码是这样的:
char* input = "Hello";
void* output_buf = new char[1024];
foo(input, output_buf); // Compiler Error C2664
标准不会隐式接受从void *到char *的转换。所以下面的代码可以工作:
char* input = "Hello";
void* output_buf = new char[1024];
foo(input, (char*)output_buf); // OK
答案 0 :(得分:3)
这很奇怪,因为在C ++中,数组类型的任何函数参数实际上都被认为是指针类型,即编译器看到的“真实”函数签名是
void foo(const void* input, char* output);
确定每个参数的类型后,任何类型为“T of T”的参数都被调整为“指向T的指针”(C ++ 11,[dcl.fct],¶5)< / p>
最重要的是,您的代码 正常工作,您可以看到here;您确定您的“缩小”示例实际上反映了您所看到的问题吗?可能问题在于另一个参数的类型。
答案 1 :(得分:2)
问题不在于output
。实际上,您的函数不会采用数组,因为您无法将数组传递给函数。它接收一个指向char的指针。这也可行:
void foo(char f[1024])
{
// blah
}
int main() {
char c1[1];
foo(c1); // works!
char *c2 = new char[27];
foo(c2); // works!
delete [] c2;
}
该代码将编译,并且它会这样做,因为函数接收指针,即全部。所以,问题出在你的第一个论点input
上。它的类型一定是错的。更仔细地查看您的错误消息和/或向我们显示input
的声明。