Drucken eines Funktionszeigers ohne Aufruf
Wenn Sie versuchen, eine Funktion ohne Klammern zu drucken (d. h. als f statt f()), Es kann zu unerwarteten Ergebnissen kommen, wie zum Beispiel, dass immer der Wert 1 ausgegeben wird. Dieses scheinbar paradoxe Verhalten ist auf den zugrunde liegenden Mechanismus zurückzuführen.
Im bereitgestellten Code ist die Anweisung cout << pr; ruft die Funktion pr nicht wirklich auf. Stattdessen wird der Funktionszeiger pr an cout übergeben. C interpretiert diesen Zeiger implizit als Bool-Wert, wobei ein Nicht-Null-Zeiger als „true“ ausgewertet und daher als 1 ausgegeben wird.
Um den Funktionszeiger selbst auszugeben, muss man ihn explizit in einen void*-Zeiger umwandeln . Dies kann durch die Verwendung von Ausdrücken wie cout << erreicht werden. (void*)pr.
C 11 und Funktionszeigerüberladung
Mit der Einführung von C 11 entstand eine bequemere Methode zum Drucken von Funktionszeigern. Überlastung des << Der Operator für Funktionszeiger ermöglicht eine informativere Ausgabe. Beispielsweise kann man eine Überladung definieren, die die Adresse und die Arität (Anzahl der Argumente) der Funktion ausgibt:
<code class="cpp">template <class RType, class ... ArgTypes> std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...)) { return s << "(func_ptr=" << (void*)func << ")(num_args=" << sizeof...(ArgTypes) << ")"; }
Diese Überladung gibt die Ausgabe im Format (func_ptr=
) (num_args=< ;arity>).Das obige ist der detaillierte Inhalt vonWie drucke ich einen Funktionszeiger in C, ohne ihn aufzurufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!