3 Stimmen

Gibt es einen Weg, einen Strukturtyp an eine c-Funktion zu übergeben?

Ich habe einige Code mit mehreren Funktionen, die sich sehr ähnlich sind, um ein Element in einer Liste basierend auf dem Inhalt eines Feldes in einer Struktur zu suchen. Der einzige Unterschied zwischen den Funktionen besteht darin, dass der Typ der Struktur, in dem die Suche stattfindet, unterschiedlich ist. Wenn ich den Typ übergeben könnte, könnte ich die Code-Duplizierung entfernen.

Ich habe auch bemerkt, dass in diesen Funktionen einige Mutex-Sperren stattfinden, daher denke ich, dass ich sie lieber in Ruhe lasse...

0voto

Gordon Wrigley Punkte 10037

Sie können dies mit einem parameterisierten Makro tun, aber die meisten Codierungsrichtlinien werden das missbilligen.

#include 
#define getfield(s, name) ((s).name)

typedef struct{
  int x;
}Bob;

typedef struct{
  int y;
}Fred;

int main(int argc, char**argv){
    Bob b;
    b.x=6;

    Fred f;
    f.y=7;

    printf("%d, %d\n", getfield(b, x), getfield(f, y));
}

0voto

duane Punkte 2113

Kurze Antwort: Nein. Sie können jedoch Ihre eigene Methode erstellen, um dies zu tun, d.h. eine Spezifikation bereitstellen, wie man ein solches Struct erstellen kann. Es ist jedoch im Allgemeinen nicht notwendig und lohnt sich nicht; geben Sie einfach per Referenz weiter. (callFuncWithInputThenOutput(input, &struct.output);)

-1voto

Charles Graham Punkte 23517

Ich bin ein wenig aus der Übung mit c, aber versuchen Sie es, einen void* Zeiger als den Variablentyp im Funktionsparameter zu verwenden. Geben Sie dann die Adresse der Struktur an die Funktion weiter und verwenden Sie sie dann auf die gleiche Weise, wie Sie es normalerweise tun würden.

void foo(void* obj);

void main()
{
  struct bla obj;
  ...
  foo(&obj);
  ...
}

void foo(void* obj)
{
  printf(obj -> x, "%s")
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X