In C ++ können Sie sowohl generische als auch typsichere Container verwenden, indem Sie Vorlagen verwenden. Wenn Sie jedoch in C generische Container verwenden möchten, müssen Sie (afaik) void*
verwenden, was bedeutet, dass Sie die Typsicherheit verlieren. Um typsichere Container zu haben, müssten Sie sie für jede Art von Daten, die Sie aufbewahren möchten, neu implementieren.
Wenn man bedenkt, dass C eine Philosophie verfolgt, die mehr von der Programmierer-weiß-was-er-macht als C ++ versteht, was wäre die idiomatischere Sache in C: benutze generische Container mit void*
oder benutzerdefinierte Container für jede Art von Daten erstellen?
Ich würde nach generischen Containern zielen:
Sobald du dich daran gewöhnt hast, denkst du nur an void *
ist der Typ von etwas, wenn ich mich nicht um seinen Typ kümmere. Es ist wie Object
in Java - wo lange generische Container auch keine Typsicherheit hatten.
Sie haben nur einen Ort, an dem Sie Verbesserungen vornehmen können.
Sie erhalten den Typ Sicherheit nicht; Bei wiederholten Implementierungen typsicherer Container besteht jedoch das Risiko von Fehlern beim Kopieren und Einfügen. Das kann auch zu Fehlern führen.
Sie haben keinen wirklichen Vorteil, void*
als Mitglied zu verwenden (es sei denn, die Kompilierungszeiten sind am wichtigsten). Sie können jederzeit in void*
umwandeln und dann bei Bedarf an nicht typisierten Datenblobs arbeiten.
Ich habe solche Schnittstellen in C implementiert (z. B. mehrere Varianten mit benannten Feldern unterschiedlicher Typen). Ich bevorzuge die Art der Sicherheit, und fand selten Casting zu void*
eine gute Sache in diesen Implementierungen.
... dann verbringe ich wieder mehr Zeit mit dem Schreiben von C ++ als c:)
Ich hatte also eine schnelle Suche nach neuen cleveren Ideen im Bereich der C-Container.
Ich habe dies gefunden. Es ist ein ziemlich gründlicher Versuch einer vollständigen C-Container-Bibliothek.
Er umgeht die Elemente, die in void *
Zeigern enthalten sein sollen. Es wird nicht versucht, Strukturen eines bestimmten Typs anzugeben.
Für Typ Sicherheit könnten Sie ein "Wrapper" -Makro für jeden Container schreiben, das einen Host definiert, wenn Inline-Funktionen eine untypisierte Version umschließen und den Typ Sicherheit bereitstellen. Hoffentlich würden sie vom Compiler weg optimiert werden, aber das ist nicht immer möglich. Und die Makros wären hässlich .
Ich denke, das ist einer der Gründe, warum mehr (Anwendungs-) Programme in C ++ statt in C geschrieben werden. Die Fähigkeit, komplexe Abstraktionen in C zu erzeugen, ist begrenzt. Sie können es tun, aber Sie opfern in der Regel andere Aspekte wie Leistung oder Wartbarkeit (siehe zum Beispiel ein C GTK-Programm).
Tags und Links c idioms generic-programming containers void-pointers