C99 staat geen impliciete conversie toe tussen pointers van verschillende typen (behalve van/naar void *
). Dit is wat de C99 Rationale zegt:
Het is ongeldig om een aanwijzer naar een object van elk type naar een aanwijzer te converteren naar een object van een ander type zonder een expliciete cast.
Dit is een gevolg van de regels voor toewijzing, die een beperking heeft die een van de volgende zal hebben (als er verwijzingen zijn) (C99 6.5.16.1 "Eenvoudige toewijzing"):
- beide operanden zijn verwijzingen naar gekwalificeerde of niet-gekwalificeerde versies van compatibele typen en het type waarnaar links wordt verwezen heeft alle
qualifiers van het type waarnaar door het recht wordt verwezen;
- één operand is een verwijzing naar een object of een incompleet type en de andere is een verwijzing naar een gekwalificeerde of niet-gekwalificeerde versie van de ongeldige versie, en
het type waarnaar links verwijst heeft alle kwalificaties van het type
naar rechts gewezen;
- de linker operand is een aanwijzer en de rechterkant is een nul-aanwijzerconstante
Het doorgeven van een aanwijzer als argument aan een prototype functie volgt dezelfde regels omdat (C99 6.5.2.2/7 "Functieaanroepen"):
Als de uitdrukking die de opgeroepen functie aangeeft, een type heeft
bevat een prototype, de argumenten worden impliciet omgezet, zoals
bij opdracht, naar de typen van de bijbehorende parameters
Zowel C90 en C11 hebben dezelfde formulering.
Ik geloof dat veel compilers (inclusief GCC) deze beperking versoepelen door slechts een waarschuwing te geven omdat er te veel oude code is die ervan afhangt. Houd er rekening mee dat void *
een uitvinding was van de ANSI C-standaard, dus een standaardvoorwaarde en waarschijnlijk veel postnormale code die over het algemeen wordt gebruikt char *
of < code> int * als een 'generiek' aanwijzertype.