Ist es eine gute Übung, die Strukturdefinition in C zu verstecken?

8

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 :

%Vor%

In lib.c :

%Vor%

In example.c :

%Vor%

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.

    
Alexander Solovets 15.12.2015, 22:14
quelle

2 Antworten

3

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.

    
chux 15.12.2015, 22:55
quelle
2
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ tag123memorymanagement ___ Prozess des dynamischen Zuweisens und Freigebens von Teilen des physischen Speichers, um auf Programmanforderungen mit, wenn möglich, Fairness und ohne Verhungern unter den Anforderern zu antworten. ___ answer34301009 ___

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.

    
___ answer34300721 ​​___

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.

    
___ tag123struct ___ Ein Schlüsselwort in verschiedenen Programmiersprachen, deren Syntax C ähnelt oder von C abgeleitet ist (C ++, C #, Swift, Go usw.). Verwenden Sie ein spezielles Programmiersprachen-Tag, um Fragen zu markieren, die die Verwendung einer 'struct' als Syntax beinhalten, und Semantik kann sprachabhängig sein. Schlüsselwort definiert oder deklariert einen Datentyp, der aus anderen Datentypen besteht. Jedes Mitglied einer Struktur hat seinen eigenen Speicherbereich (im Gegensatz zu einer "Union", deren Mitglieder einen einzigen Speicherbereich teilen). ___ qstnhdr ___ Ist es eine gute Übung, die Strukturdefinition in C zu verstecken? ___ tag123alloca ___ Alloca ist eine Funktion zum dynamischen Zuordnen von Speicher auf dem Stack in C. Dieser Speicher wird beim Verlassen der Funktion automatisch freigegeben. ___ qstntxt ___

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.

    
___
chqrlie 15.12.2015 22:32
quelle

Tags und Links