C-Syntax zum Typecast (sieht aus wie Funktionsaufruf)

OP #7872725
Lesenswert?

Eine Frage zur C-Syntax: Was passiert hier? Es scheint ein Typecast zu sein, aber die Syntax kenne ich nicht:

1
  espnowregisterrecvcb (espnowrecvcbt (OnDataRecv));

OnDataRecv ist ein Zeiger auf eine Funktion. espnowrecvcbt ist ein Typ (Functionpointer):

1
  typedef void (*espnowrecvcbt)(const inf_t * inf, const uint8_t *dat, int len);

espnowregisterrecvcb() ist eine Funktion, die einen Functionpointer erwartet.

Nach meiner Kenntnis hätte ich für ein Typecast in Etwa erwartet:

1
  espnowregisterrecvcb ( (espnowrecvcbt) OnDataRecv);

Ist das oben (schon immer) gültiges C? Ist das ein Typecast? Was ist der Unterschied zwischen der vorgefundenen und der von mir als richtig empfundenen Syntax?

#7872735
Lesenswert?

Du kannst mit einem Funktionspointer die darüber referenzierte Funktion aufrufen:

1
#include <stdio.h>
2

3
void f(int x)
4
{
5
  printf("%i\r\n", x);
6
}
7

8
typedef void (*func)(int x);
9

10
int main(int argc, char *argv)
11
{
12
  func fp = f;
13
  fp(42);
14
  return 0;
15
}

Das ist Standard-C.

Beitrag #7872736 wurde von einem Moderator gelöscht.
#7872743
Lesenswert?

Peter M. schrieb:

Ich habe mich unklar ausgedrückt:espnowrecvcbt ist kein Functionpointer, sondern ein Typ für einen Pointer auf Funktion. Im OP definiert per

Das ist doch in meinem Beispiel in Zeile 8 ganz genauso. Vergleiche mal

1
typedef void (*espnowrecvcbt)(const inf_t * inf, const uint8_t *dat, int len);

mit

1
typedef void (*func)(int x);

Da sind nur die Argumente anders. Beide sind per Definition Typen für je einen Funktionspointer.

OP #7872747
Lesenswert?

Thomas F. schrieb:

Das ist doch in meinem Beispiel in Zeile 8 ganz genauso. Vergleiche mal Da sind nur die Argumente anders.

Ja. Aber in Deinem Beispiel schreibst Du danach fp(42) und nicht func(42). fp ist der Functionpointer und func der Typ dazu.

Hinweis: Habe nur sehr rudimentäre Erfahrung mit C++ und denke bei meinen Fragen und Ausführungen immer eher an C. Wenn mich das in die Irre leitet, bitte ich um Hinweise.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren