Типы параметров в стандартной библиотеке C ++ - PullRequest
1 голос
/ 12 ноября 2011

Я заметил, что некоторые стандартные библиотечные функции используют void * в качестве своих параметров, например, функция memcpy, ее прототип:

void * memcpy ( void * destination, const void * source, size_t num );

Есть также функции, использующие char * в качестве своих параметров, дляНапример, функция read класса ifstream, ее прототип:

istream& read ( char* s, streamsize n );

Почему стандартная библиотека не объединяет эти параметры, например, все с использованием char * или все с использованием void *.Есть какие-то особые причины?

cheng

1 Ответ

2 голосов
/ 12 ноября 2011

Указатели можно неявно приводить к void*, но не char*. Это приводит к безопасности типов - если вы заботитесь о типе, не используйте void*.

Поскольку memcpy предназначен для работы с типами указателей, он использует void*. read не был разработан для работы со всеми типами указателей и поэтому использует char*

void foo(void* x) {}
void bar(char* x) {}

int main() {
  int* x;
  foo(x);
  bar(x); // error - can't convert int* to char*
}
...