Definieren Sie Funktionen in Strukturen

Lesezeit: 4 Minuten

Benutzeravatar von prehistoricpenguin
prähistorischer Pinguin

Können wir Funktionen in Strukturen in der Programmiersprache C definieren?

  • Meinst du so etwas wie struct A { void f(void) {…} }; ?

    – tschap

    26. März 2012 um 11:24 Uhr


Benutzeravatar von glglgl
glglgl

Nein, da Funktionen keine Daten sind. Aber Sie können Funktionszeiger innerhalb einer Struktur definieren.

struct foo {
    int a;
    void (*workwithit)(struct foo *);
}

Sie können in C nicht wirklich Dinge innerhalb einer Struktur deklarieren. Dies ist nicht C++ oder eine andere OO-Sprache, in der ein Objekt eine Art Gültigkeitsbereich kapselt.

C-Strukturen sind sehr einfache Objekte, es ist nur syntaktischer Zucker zum Verwalten eines Stücks Speicher. Wenn Sie eine neue Struktur “Instanz” erstellen, struct A a;reserviert der Compiler nur Stapelplatz entsprechend seiner Größe und wenn Sie dies tun a.memberder Compiler kennt den Offset dieses Members, also springt er dorthin &a + Offset dieses Mitglieds. Diese Offsets sind normalerweise nicht nur Summen der Größen vorangehender Mitglieder, da der Compiler normalerweise einige Füllbits in die Struktur einfügt, um sie besser im Speicher auszurichten.

Hoffe es hat ein bisschen geholfen. Sie erwarten offensichtlich etwas zu viel von C-Strukturen 🙂

Ich bin zu diesem Beitrag gekommen, weil ich nach einer Möglichkeit gesucht habe, ein wenig objektorientierten “Stil” der Programmierung in C für einen sehr einfachen Datenstrukturkurs zu vermitteln. Ich wollte C++ nicht unterrichten, weil ich seine fortgeschritteneren Funktionen nicht ständig erklären wollte.

Aber ich wollte erkunden, wie man das könnte implementieren das in Python verwendete OO-Muster, jedoch in einer Low-Level-Sprache / Laufzeit. Indem sie erklären, was in C vor sich geht, können die Schüler die Laufzeitmuster von Python OO besser verstehen. Also ging ich etwas über die erste Antwort oben hinaus und passte einige der Muster von https://stackoverflow.com/a/12642862/1994792 an, aber auf eine Weise, die die OO-Laufzeitmuster ein wenig verdeutlichen würde.

Zuerst habe ich die “Klasse” mit einem “Konstruktor” in gemacht Punkt.c:

#include <stdio.h>
#include <stdlib.h>

struct point
{
    int x;
    int y;
    void (*print)(const struct point*);
    void (*del)(const struct point*);
};

void point_print(const struct point* self)
{
    printf("x=%d\n", self->x);
    printf("y=%d\n", self->y);
}

void point_del(const struct point* self) {
  free((void *)self);
}

struct point * point_new(int x, int y) {
    struct point *p = malloc(sizeof(*p));
    p->x = x;
    p->y = y;
    p->print = point_print;
    p->del = point_del;
    return p;
}

Dann habe ich die Klasse importiert, ein Objekt aus der Klasse erstellt, das Objekt verwendet und dann das Objekt zerstört Haupt c

#include "point.c"

int main(void)
{
    struct point * p3 = point_new(4,5);
    p3->print(p3);
    p3->del(p3);
}

Es fühlt sich sehr “Pythonic in C” an.

  • Das ist wirklich aufschlussreich, ich fühle mich, als hätte ich ein Osterei gefunden. Dies sollte mehr Upvotes haben!

    – tgabb

    16. Dezember 2020 um 23:17 Uhr

  • Frage aber, warum wirfst du vor dem Befreien auf den Void-Zeiger?

    – tgabb

    16. Dezember 2020 um 23:32 Uhr

  • @drchuck Ich stimme tgabb zu, dass dein Beitrag großartig ist! Es hat mir sehr geholfen. Hut ab!

    – Roger Costello

    9. April 2021 um 18:15 Uhr

  • @tgabb – Die Funktion free() erwartet als Parameter ein (void *). Daher versuche ich, Warnmeldungen zu vermeiden.

    – drchuck

    11. April 2021 um 15:14 Uhr

Benutzeravatar von Sonu Mishra
Sonu Mishra

Nein, Sie können keine Funktionen innerhalb von Struct in einem C-Programm haben. Ich habe einen einzelnen Code geschrieben und diesen als .c und .cpp gespeichert. Die .cpp-Datei entspricht und funktioniert wie erwartet, aber die .c-Datei wird nicht einmal kompiliert.

Hier ist der Code für Ihre Referenz. Speichern Sie es einmal als .cpp und führen Sie es dann aus. Speichern Sie dann denselben Code als .c und kompilieren Sie ihn. Sie erhalten einen Kompilierungsfehler.

#include <stdio.h>
struct C {
    void Test(int value) {
       static int var = 0;
       if (var == value) 
          printf("var == value\n");
       else
          printf("var != value\n");

       var = value;
     }
 }; 

 int main() {
    C c1;
    C c2;
    c1.Test(100);
    c2.Test(100);
    int ii;
    scanf("%d",&ii);
 }

Nein.

Sie können Funktionszeiger in Strukturen haben, aber das ist so nah wie möglich.

Nein, das kannst du nicht. Strukturen können nur Variablen enthalten, das Speichern von Funktionszeigern innerhalb der Struktur kann Ihnen das gewünschte Ergebnis liefern.

Benutzeravatar von NDEthos
NTEthos

Nein, aber Sie können in C++ struct!

  • Also beantwortete ich seine Frage mit „Nein“. Hast du diesen Teil verpasst?

    – NTEthos

    18. Dezember 2014 um 2:27 Uhr

1412970cookie-checkDefinieren Sie Funktionen in Strukturen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy