У меня есть сторонняя библиотека, которая имеет следующую функцию:
void foo(const void* input, char output[1024]);
Если я напишу что-то вроде этого:
char* input = "Hello";
char output[1024];
foo(input, output); // OK
Но я не хочу объявлять такой большой массив в стеке (это было бы очень опасно в среде ядра ОС). Поэтому я должен сделать что-то вроде этого:
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
Проблема не с output
, В действительности ваша функция не принимает массив, так как вы не можете передавать массивы в функции. Получает указатель на символ. Это будет работать так же:
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
,
Это странно, поскольку в C ++ любой аргумент функции типа массива фактически считается указателем, т. Е. Сигнатура «реальной» функции, видимая компилятором,
void foo(const void* input, char* output);
После определения типа каждого параметра любой параметр типа «массив из T» […] настраивается на «указатель на T» (C ++ 11, [dcl.fct], ¶5)
Самое главное, ваш код делает работа, как видите Вот; Вы уверены, что ваш «суженный» пример действительно отражает проблему, с которой вы столкнулись? Вероятно, проблема заключается в типе другого параметра.