Was Klaus sagen möchte ist, dass das es bei dem Problem gar nicht um
einen Opaque Pointer geht, weil T_Car2 nicht nur (vorwärts) Deklariert,
sondern auch definiert wird.
Nur wenn die Definition von T_Car2 vom normalen Verwender des Codes
verborgen wäre würde es sich um einen Opaque Pointer für den Verwender
des Codes handeln.
Das ist einfache eine Forward Reference, also eine Referenz auf einen
Typen der erst später definiert wird. In C löst man eine Forward
Reference mit einer Forward Declaration auf. Die Forward Declaration ist
in diesem Fall die Deklaration eines Incomplete Types.
Die Definition eines Incomplete Types ist einfach, ein Typ dessen Größe
momentan nicht bekannt ist. Incomplete Types gibt es nur bei structs,
unions und Arrays und mit void. Andere Datentypen kann man nur
vollständig deklarieren.