Forum: Compiler & IDEs Funktionspointer in Struktur


von Mattias Kölling (Gast)


Lesenswert?

Hallo,

wie kann ich einen Funktionspointer in einer Struktur vereinbaren? Wenn
ich folgendes vereinbare
typedef struct
{
  uint16_t period;
  uint8_t  offset;
  void *function(void);
}
OS_TASKS;
bekomme ich folgende Fehlermeldung:
../os.h:37: error: field `function' declared as a function
Das ganze soll auf einem ATMEGA48 laufen.
Sorry für den kurzen Sourcecode im Text.

von Karl H. (kbuchegg)


Lesenswert?

Das ist kein Funktionspointer was du da hast.

typedef struct
{
  uint16_t period;
  uint8_t  offset;
  void (*function)(void);
}
OS_TASKS;

Jetzt ist es einer.

von Mattias Kölling (Gast)


Lesenswert?

Hallo Karl Heinz,

danke für den Tipp! Ist das GCC-spezifisch? Bei anderen Compilern
konnte ich bis jetzt die Klammern weglassen. Außerhalb der
Strukturdefinition hat der Compiler nicht gemeckert.
Danke nochmals!

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Nö, 'void *' ist kein Funktionszeiger, sondern ein nicht näher
spezifizierter Zeiger. <type> (*<func>)(<param>) dagegen ein
Funktionszeiger.

von Christoph _. (chris)


Lesenswert?

> Nö, 'void *' ist kein Funktionszeiger, sondern ein nicht
> näher spezifizierter Zeiger.

Das stimmt zwar, aber in der struct von Mattias ist eine Funktion ohne
Parameter, die void* zurückgibt, deklariert.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Das stimmt zwar, aber in der struct von Mattias ist eine Funktion
> ohne Parameter, die void* zurückgibt, deklariert.

In einem C++-Kontext wäre das eine gültige Deklaration (damit wird
dann eine Methode zu dieser Klasse deklariert).  Damit ist es zwar
syntaktisch richtig, aber semantisch natürlich etwas völlig anderes.

In einem C-Kontext ist es selbst syntaktisch falsch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.