Parametervormen in standaardbibliotheek C ++

Ik merkte dat sommige standaard bibliotheekfuncties ongeldig * gebruiken als hun parameters, bijvoorbeeld de functie memcpy , het prototype is:

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

Er zijn ook functies die char * als hun parameter gebruiken, bijvoorbeeld de lees functie van ifstream klasse, het prototype is:

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

Waarom verenigt de standaardbibliotheek deze parameters niet, bijvoorbeeld allemaal met char * of alle met behulp van void *. Zijn er bepaalde redenen?

cheng

1
De oude C-functies maakten meestal gebruik van lege wijzers voor geheugenlocaties. Dat is geweldig en goed, en dat geldt ook voor de toewijzingsfuncties voor C ++, maar ongeldige aanwijzers lenen zich niet voor rekenkundige berekeningen. Aangezien char "byte" betekent (d.w.z. "kleinste gegevenseenheid"), is char * in feite een volledig bevredigend vervangingstype. Oh nou ja.
toegevoegd de auteur Kerrek SB, de bron
memcpy is beslist geen STL-functie!
toegevoegd de auteur Oliver Charlesworth, de bron
Evenmin is istream .
toegevoegd de auteur Pubby, de bron
@Pubby Ok. Laten we zeggen dat het een partij is van de standaardfuncties van C ++.
toegevoegd de auteur cheng, de bron

1 antwoord

Pointers kunnen impliciet worden gecast naar void * , maar niet char * . Dit leidt tot type veiligheid - als u om het type geeft, gebruik dan void * niet.

Since memcpy is designed to work on pointer types it uses void*. read was not designed to work on all pointer types and so it uses char*

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

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