Können wir Funktionen in Strukturen in der Programmiersprache C definieren?
Definieren Sie Funktionen in Strukturen
prähistorischer Pinguin
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.member
der 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
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.
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
Meinst du so etwas wie struct A { void f(void) {…} }; ?
– tschap
26. März 2012 um 11:24 Uhr