Ich denke, dass das Verbergen der Definition der Struktur den Code sicherer macht, wenn Sie mit Hilfe des Compilers erzwingen, dass kein Mitglied der Struktur direkt angesprochen werden kann. Der Nachteil ist, dass Benutzer keine Variablen vom Strukturtyp im Stack deklarieren können, da die Größe der Struktur nicht bekannt ist, während es manchmal wünschenswert ist, malloc()
zu vermeiden. Dies kann (mit einem Teil-Erfolg) mit alloca(3)
gelöst werden in allen gängigen libc-Implementierungen, obwohl diese Funktion nicht mit POSIX konform ist. Angesichts dieser kleinen Vor- und Nachteile, kann ein solches Design allgemein als gut angesehen werden?
In lib.h
:
In lib.c
:
In example.c
:
UPD : Die Frage wurde aktualisiert, und es wird ausdrücklich gesagt, dass die Idee, alloca()
zu verwenden, darin besteht, die Struktur auf dem Stack zu deklarieren und ihre Definition zu verbergen.
Ja, es ist eine gute Methode, Daten auszublenden.
Alternativ zu alloca(foo_size);
wird ein ausgerichtetes Zeichenarray deklariert und eine Zeigerkonvertierung durchgeführt.
Die Zeigerkonvertierung ist jedoch nicht vollständig portierbar.
Das Zeichenarray muss ein VLA sein, wenn die Größe eine Variable und keine Kompilierzeitkonstante sein muss.
%Vor% Wenn VLAs nicht erwünscht / verfügbar sind, deklarieren Sie die Größe als eine Konstante wie #define foo_N 100
, die sicher ist, mindestens so viel wie nötig zu sein.
Ja, es ist eine gute Methode, Daten auszublenden.
Alternativ zu bar
wird ein ausgerichtetes Zeichenarray deklariert und eine Zeigerkonvertierung durchgeführt.
Die Zeigerkonvertierung ist jedoch nicht vollständig portierbar.
Das Zeichenarray muss ein VLA sein, wenn die Größe eine Variable und keine Kompilierzeitkonstante sein muss.
%Vor% Wenn VLAs nicht erwünscht / verfügbar sind, deklarieren Sie die Größe als eine Konstante wie foo
, die sicher ist, mindestens so viel wie nötig zu sein.
Die Funktion foo_create()
ruft undefiniertes Verhalten auf: Die Struktur, auf die foo_finalize
zeigt, ist nicht initialisiert.
Wenn Sie die Strukturdetails ausblenden möchten, stellen Sie eine %code% bereit, die eine zuweist und initialisiert und %code% , die Ressourcen freigibt und sie freigibt.
Was Sie vorschlagen, könnte funktionieren, aber ist fehleranfällig und keine allgemeine Lösung.
Ich denke, dass das Verbergen der Definition der Struktur den Code sicherer macht, wenn Sie mit Hilfe des Compilers erzwingen, dass kein Mitglied der Struktur direkt angesprochen werden kann. Der Nachteil ist, dass Benutzer keine Variablen vom Strukturtyp im Stack deklarieren können, da die Größe der Struktur nicht bekannt ist, während es manchmal wünschenswert ist, %code% zu vermeiden. Dies kann (mit einem Teil-Erfolg) mit %code% gelöst werden in allen gängigen libc-Implementierungen, obwohl diese Funktion nicht mit POSIX konform ist. Angesichts dieser kleinen Vor- und Nachteile, kann ein solches Design allgemein als gut angesehen werden?
In %code% :
%Vor%In %code% :
%Vor%In %code% :
%Vor%UPD : Die Frage wurde aktualisiert, und es wird ausdrücklich gesagt, dass die Idee, %code% zu verwenden, darin besteht, die Struktur auf dem Stack zu deklarieren und ihre Definition zu verbergen.
Tags und Links c memory-management struct alloca