In C, generische Container oder sichere Container?

8

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?

    
Paul Manta 29.04.2012, 05:37
quelle

4 Antworten

3

Ich würde nach generischen Containern zielen:

  1. 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.

  2. Sie haben nur einen Ort, an dem Sie Verbesserungen vornehmen können.

  3. 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.

Edmund 29.04.2012, 06:19
quelle
0

Um einen Typ zu erstellen, der generische Daten in C verarbeitet, verwenden Sie void* , um die Daten zu übergeben. Es ist unpraktisch, neue Algorithmen für jeden möglichen Typ zu definieren.

    
Ed S. 29.04.2012 05:39
quelle
0

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:)

    
justin 29.04.2012 05:53
quelle
0

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).

    
Michael Slade 29.04.2012 05:58
quelle