1

一部の標準ライブラリ関数がパラメータとしてvoid*を使用していることに気付きました。たとえば、memcpy関数のプロトタイプは次のとおりです。

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

パラメータとしてchar*を使用する関数もあります。たとえば、クラスのread関数ですifstream。そのプロトタイプは次のとおりです。

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

標準ライブラリがこれらのパラメータを統合しないのはなぜですか。たとえば、すべてchar *を使用するか、すべてvoid*を使用します。特別な理由はありますか?

チェン

4

1 に答える 1

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*
}
于 2011-11-12T02:38:14.387 に答える