我注意到一些标准库函数使用void *作为参数,例如memcpy
函数,其原型是:
void * memcpy ( void * destination, const void * source, size_t num );
还有使用char *作为参数的函数,例如read
类的ifstream
函数,其原型是:
istream& read ( char* s, streamsize n );
为什么标准库没有统一这些参数,例如,所有使用char *或全部使用void *。有什么特别的原因吗?
成
答案 0 :(得分:2)
指针可以隐式投放到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*
}