Forum: Compiler & IDEs C-Syntax zum Typecast (sieht aus wie Funktionsaufruf)


von Peter M. (peter0)


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?

von Sebastian C. (basti79)


Lesenswert?

Hi,

in C++ gibt es zwei verschieden Syntax für einen Type-Cast:

x = (int) a;
x = int (a);

Soweit ich weiß, ist beides gleichwertig und es macht keinen 
Unterschied, welchen du benutzt.

Greets,
  Sebastian.

von Thomas F. (tommf)


Lesenswert?

Peter M. schrieb:
> espnowregisterrecvcb (espnowrecvcbt (OnDataRecv));

Das ein Funktionsaufruf von espnowrecvcbt() mit dem Argument OnDataRecv, 
dessen Ergebnis als Argument für die Funktion espnowregisterrecvcb() 
verwendet wird.

Kein Typecast.

von Peter M. (peter0)


Lesenswert?

Aber
1
espnowrecvcbt
 ist nunmal keine Funktion, sondern ein Typ. Aber genau das meinte ich 
mit "sieht aus wie Funktionsaufruf".

Aber wenn es ein C++-Ding ist ... ich habe nicht mit C++-Code gerechnet.

von Thomas F. (tommf)


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.

: Bearbeitet durch User
Beitrag #7872736 wurde vom Autor gelöscht.
von Peter M. (peter0)


Lesenswert?

Thomas F. schrieb:
> Du kannst mit einem Funktionspointer die darüber referenzierte Funktion
> aufrufen

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

von Peter M. (peter0)


Lesenswert?

Sebastian C. schrieb:
> in C++ gibt es zwei verschieden Syntax für einen Type-Cast:

Danke

von Thomas F. (tommf)


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.

von Thomas F. (tommf)


Lesenswert?

Sebastian C. schrieb:
1
x = (int) a;
2
x = int (a);
Versuche das mal zu übersetzen. Zeile 2 ist kein gültiger C-Code und 
führt zu einem Fehler.

von Peter M. (peter0)


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.

von Thomas F. (tommf)


Lesenswert?

Jetzt sehe ich, was du meinst. Sorry für die Irreführung.

Lt. https://cplusplus.com/doc/tutorial/typecasting gibt es in C++ die 
beiden von Sebastian erwähnten Varianten. Dann ist das wohl tatsächlich 
C++-Code. In C geht das aber so nicht.

: Bearbeitet durch User
von Mikro 7. (mikro77)


Lesenswert?

Der Vollständigkeit-halber, falls iwer auf den Thread stößt und 
Referenzen braucht:
https://en.cppreference.com/w/cpp/language/explicit_cast

von Rüdiger B. (rbruns)


Lesenswert?

Das ist ein typischer callback.

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.