Wie kann ich eine Funktion erstellen, die einen parameter nimmt, unbekannter Typ in C?
Sagen, ich habe den folgenden code:
struct test* t1;
t1 = get_t(1);
... wo get_t
ist:
struct test* get_t(int);
Wie kann ich umgestalten, den obigen code, und legte es in eine Funktion? So etwas wie die folgenden:
void r1(?* t, ?* (fn*)(int)) {
t = fn(1);
}
/* ... */
struct test* t1;
r1(t1, &get_t);
- Nun könnte man verwenden
void r1(struct test* t, struct test* (fn*)(int))
... warum ist der parameter der unbekannten geben? - Da möchte ich die gleiche Funktion für einen, sagen wir,
struct another_test
. Ebenso habe ichstruct test* t1
und verwendenr1(t1, &get_t)
, ich möchte in der Lage sein, auchstruct another_test* t2
und verwendenr1(t2, &get_at)
, woget_at
zurückstruct another_test*
, und die gleichen Dinge tut, um es zu erhalten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
verwenden
void *param
ein Zeiger auf etwas ... Häufig in der glib alsgpointer
r1
alsvoid r1(void* t, void* (fn*)(int))
, und der compiler beschwert sich, dass ich gebe es nicht die richtige Funktion, da meinget_t
- Funktion gibt einestruct test*
.get_t
muss zurückvoid *
als gut.get_t
Gegenzug einevoid*
?void **t
argument und*t = fn(1);
Zuordnung. Die Nutzung ist dannr1(&t1,&get_t)
so dass t1 zugeordnet ist.Habe ich zwei Ideen:
[1] Pass
void
Zeiger auf die variable/Objekt-und Typ-cast in der Funktion.[2] eine Vereinigung aller Datentypen zusammen mit einem integer-Datentyp, die identifizieren, welcher Datentyp die variable in der union hält die eigentlichen Daten. Pass diese union als Wert oder als
void *
Etwas wie dieses.
Können Sie hash definieren, die
FLOAT
undINT
und andere als eindeutige Werte.Oder einfach
Wenn Sie gcc verwenden, können Sie diese mehr typesafe-version:
Rufen wie:
(Sie brauchen nicht zu verwenden
&
auf Funktionen, Sie zerfallen zu Zeigern automatisch, wie arrays). Dies überprüft, obt
ist ein Zeiger, und dassget_t
ist eine Funktion zurückgeben, die Zeiger._varp_
ist technisch unnötige, aber hält das argument der Auswertung in die richtige Reihenfolge.Edit:
Wenn Sie den gcc nicht besitzen, können Sie das weiterhin tun, aber Sie haben, um den Typ explizit:
Rufen wie:
nicht ganz so sicher, und mehr überflüssig, aber immer noch ziemlich gut.