Private Mitglieder in C-Strukturen

18. Mai 2008 · in C Geschrieben / C + +

In dieser Woche hatten hier bei der Arbeit mehr Beweis dafür, dass Programmier-Paradigma ist ein vollständig sprachunabhängig, dh nicht durch die Tatsache, dass Sie die Programmierung in C + + sind das Kompilieren mit g + +-Code wird objektorientierte so wenig, wenn Sie Programm in ANSI-C-Code wird notwendigerweise strukturiert sein, oder Sie werden nicht zur objektorientierten Programmierung.

Ich lese rechts, Objektorientierung in ANSI-C?

Ja und nein!

Dinge wie Vererbung, Polymorphie und Überlastung sind kompliziert zu machen / emulieren in C, aber Sie können ein Programm mit Stil, ähnlich verhält sich zur Objekt-Orientierung. Die libdfb ist in C geschrieben, aber "objektorientierte", so dass Sie, erstellen Sie manipulieren, um Elemente, die sehr ähnlich zu verhalten, um Objekte zu zerstören.

Hier bei der Arbeit, haben wir ein System von Hardware-Abstraktion in C, die mit einem GUI-Verbindung in C + +. Die unterste Schicht in C geschrieben wurde (und sehr gut geschrieben, erzählen von der Art und Weise) mit diesen Techniken, die Simulation eines Objekt-Orientierung. Eine dieser Techniken, wurde ich durch einen dieser Browser verwenden Fußnoten der Bücher von C. Struck

Beim Kompilieren von C-Code wird jedes Symbol nur innerhalb der Zusammenstellung Einheit, in der erklärt wurde, es sei denn, es wieder in anderen Einheiten angegeben wie extern. So ist es möglich, zu "verstecken" bestimmte Symbole, die in die Erstellung Einheit, so dass sie unerreichbar für die Außenwelt. Wir haben mit diesem Paket.

Eine Zusammenstellung Einheit ist die Menge der Dateien, die nach der Vorbehandlung verarbeitet und zusammengestellt erzeugen einen einzigen Code-Objekt. Grundsätzlich (aber nicht genau), können wir wie jedes Kompilierungseinheit Umsetzung Source-Code-Datei (*. c, *. cpp. Etc). Weitere Einzelheiten über die Schritte für die Erstellung der C-und C + + kann auf dem Blog Caloni gefunden werden.

Mithilfe dieser Informationen können wir eine in ANSI-C-Struktur, in der ihre internen Mitglieder sind "private". Die Magie ist in der Definition der Mitglieder im Falle der Erstellung und Einheit zu schaffen Zugriffsmethoden für diese Mitglieder. Hierzu nutzen wir die Fußnoten, die uns zeigen den Unterschied zwischen Deklaration und Definition der Elemente in C:

Erklärung oder Manifest: der Compiler enthält eine Kennung ohne viel zu reden über ihre Bedeutung, und er meldet der Compiler, der die Kennung ist XXX, doch ist wenig über das, was er vertritt, bekannt.
ZB

  a ; extern int a;
 void ) ; void blah (void);
 struct st_date; 

Definition und Umsetzung: Weist den Compiler, der die Kennung bestimmt ist, zum Beispiel, wie viel Speicher sollte es zugewiesen werden, und was die Speicheradresse, wo wir es finden können, unter anderem.
ZB

  int a;
 void ) { /* Do anything. void blah (void) (/ * tun.  * /)
 /* Some members. st_date struct (/ * Einige Mitglieder.  * /) 

Wenn wir von Strukturen und Arten zu sprechen, ohne Einstellung der Compiler hat keine Möglichkeit, den Arbeitsspeicher, um bereitzustellen, weil sie nichts darüber, wie viel Speicherplatz eine Variable dieses Typs müssen bekannt ist. Auf der anderen Seite, manchmal ohne Angabe kann die Linke nicht weiß, dass dieses Symbol vorhanden ist.

Wenn wir eine Struktur zu deklarieren in einem Header, in der Regel definieren wir auch die Mitglieder dort und jedes Mal, fügen wir diesen Header zu einer Quelle von uns, enthalten wir bei der Zusammenstellung Einheit, die als Quelle für diese Aussage, da die Definition dieser Struktur, so dass die Mitglieder der Öffentlichkeit interinstitutionalcollaboration dieser Zusammenstellung Einheit. Dies erlaubt uns, ihre Mitglieder direkt zu öffnen.

Wenn wir uns trennen die Erklärung der Definition, nur Symbol, dass die Struktur zur Verfügung, nicht aber seine Mitglieder vertritt. So, jeder Versuch, einen direkten Zugang zu einem Mitglied, einem Compiler-Fehler generieren. Ein interessanter Nebeneffekt ist, dass, da der Compiler weiß nichts über die Größe der Struktur, können Sie nicht direkt eine Variable der Struktur, sondern nur ein Zeiger auf, weil alle Zeiger die gleiche Größe und der Compiler werden muss nur der Name des Symbols Art zu schaffen, den Zeiger.

Dann haben wir das Header mytype.h something like this:

  # Ifndef MY_TYPE_H
 # Define MY_TYPE_H

 / * Die typedef ist nicht nur zu wiederholen das Wort struct.  * /
 / * Die Anweisung wird nur die Worte: * /
 / * Strukt _MYTYPE * /
 typedef struct _MYTYPE my_type;

 my_type ** ) ; void create_my_type (my_type **);
 my_type ** ) ; void destroy_my_type (my_type **);

 my_type * , int ) ; void set_data (my_type *, int);
 my_type * ) ; int get_data (my_type *);
 my_type * , const char * ) ; void set_text (my_type *, char *);
 get_text ( my_type * ) ; char * get_text (my_type *);

 # Endif 

Umsetzung mytype.c:

  # Include "mytype.h"

 # Include <stdio.h>
 # Include <stdlib.h>
 # Include <string.h>

 /* Aqui fica a definição da estrtura. _MYTYPE Struct (/ * Hier ist die Definition der estrtura.  * /
     /* Somente depois disso é que o com-  */ int data; / * Erst nach, dass mit-* /
     21 ] ; /* pilador vai saber como alocá-la. int text [21], / * pilador wird wissen, wie es bereitzustellen.  * /
 /* Tente um sizeof(my_type) no main. ), * / Versuchen Sie eine sizeof (my_type) in der Hauptstraße.  * /

 my_type ** my_ptr ) { /* some code... void create_my_type (my_type ** my_ptr) (/ * some code ...  * /)
 my_type ** my_ptr ) { /* some code... void destroy_my_type (my_type ** my_ptr) (/ * some code ...  * /)
 my_type * my_ptr , int d ) { /* some code... void set_data (my_type * my_ptr, int d) (/ * some code ...  * /)
 my_type * my_ptr ) { /* some code... int get_data (my_type * my_ptr) (/ * some code ...  * /)
 my_type * my_ptr , const char * text ) { /* some code... void set_text (my_type * my_ptr, char * text) (/ * some code ...  * /)
 get_text ( my_type * my_ptr ) { /* some code... char * get_text (my_type * my_ptr) (/ * some code ...  * /) 

Der vollständige Quelltext Beispiel kann hier gefunden.

Da Sie nicht direkt Variablen dieses Typs zu erstellen, definieren wir ein "Baumeister" und eine "Destruktor".

Versuche, den direkten Zugriff auf die Mitglieder zu generieren Kompilierungsfehler:

  private-struct-members$ gcc -o teste mytype.h mytype.c main.c user @ host: ~ / private-struct-Mitglieder $ gcc-o test main.c mytype.h mytype.c
 main.c: In function 'main':
 main.c: 22: error: dereferencing Zeiger auf unvollständigen Typ
 private-struct-members$ user @ host: ~ / private-struct-Mitglieder $ 

So, mit ein wenig Kreativität und mit den Konzepten der sowohl die Sprache und die Paradigmen, ist es möglich, Codes umzusetzen wirklich interessant. In diesem dummes Beispiel vielleicht nicht klar gewesen, den Nutzen zu zwingen eine Emulation-Paket oder die Verwendung von Konstruktor / Destruktor in C, aber in Systemen, wo die Umstände nicht erlauben eine C + + oder die Komplexität tendenziell kritischen Werte, diese Techniken zu erreichen zeigen, von großem Wert. In unserem Fall ist, erlaubt diese Technik speziell ein erfahrener Programmierer, hat nicht das gesamte Projekt, entdeckte er, dass sein Versuch, den direkten Zugang zu einem Mitglied einer Struktur, die kontextuell unangemessen. Ohne sie wäre ein Fehler cabuloso Logik nur zur Laufzeit angezeigt werden, so dass die Software wahrscheinlich in das Gesicht des Kunden explodieren.

Nützliche Links (oder auch nicht ...):
http://www.directfb.org
http://www.caloni.com.br
http://www.numaboa.com.br/informatica/c/
Paper Development Linux Kernel

Kommentare

7 Responses to "Private Mitglieder in C-Strukturen"

  1. Diogo V. Kersting am 10. Juni 2008 16:40
  2. blab am 10. Juni 2008 23:12

    Gute Nacht,

    Wir danken Ihnen für Ihre Aufmerksamkeit.

    Ich habe die Änderung der Blog-Server und einige Links endete gebrochen. Ich werde eine Lösung finden.

    Hugs

  3. blab am 10. Juni 2008 23:58

    Wie versprochen, gibt es rechts

    Hugs

  4. blab am 11. Juni 2008 00:00
  5. Rodrigo Martins (Warlock) am 15. Juli 2008 01:30

    Es ist Zeit, etwas erlaubt, neue huh AHHuahuAHUahuA

  6. blab am 15. Juli 2008 09:09

    Witch Ja, Sie haben Recht, aber tá osso ...

    Zum Glück habe ich etwas in den Ofen :)

    Hugs

  7. Carcara am 27. Oktober 2008 13:14

    Sie können auch externe Funktionen verbergen Kompilierungseinheiten erklärt sie mit statischen - Dies gilt auch für globale Variablen. So ist die externe Festplatte wird nicht wissen, die Existenz und Funktion statische verhindern, daß sie als extern in einer anderen Datei erklärt.

Lassen Sie eine Antwort




Powered by WP Hashcash