2016-06-04 3 views
5

Unter der Annahme, dass alle Funktionen den gleichen Rückgabetyp gemeinsam haben, ist es gültig, jedes durch einen "generischen" Funktionszeiger aufzurufen, der mit leeren Klammern deklariert ist (also keine Argumente angibt)? HierDarf man Funktionen mit unterschiedlichen Prototypen durch einen pseudo-generischen Funktionszeiger aufrufen?

ist ein Beispiel-Code, dass es zeigt:

#include <stdio.h> 

void fun1(void) 
{ 
    printf("fun1\n"); 
} 

void fun2(int a) 
{ 
    printf("fun2: %d\n", a); 
} 

void fun3(int a, int b) 
{ 
    printf("fun3: %d %d\n", a, b); 
} 

int main(void) 
{ 
    void (*pf)(); // pseudo-generic function pointer 

    pf = fun1; 
    pf(); 

    pf = fun2; 
    pf(0); 

    pf = fun3; 
    pf(1, 2); 

    return 0; 
} 
+1

Mögliche Duplikate von [Funktionszeiger ohne Argumente Typen?] (Http://stackoverflow.com/questions/20835534/funktion-pointer-without-arguments-types) –

+0

Interessante Frage. Gültig wie in "Wird es kompiliert und wie erwartet ausgeführt?" Ja, sagt "Kompilieren mit" -Wall "funktioniert ohne Warnungen?" auf meinen Compilern ja :-) – Dilettant

+0

Ja, keine Warnung auch im paranoiden Modus '-Wall -Wextra -pedantische -Wwandlung 'von GCC 4.9 ... @Dilettant – alk

Antwort

6

Sie ähnliche Dinge tun, aber nicht genau auf diese Weise. Wenn Sie eine Funktion über einen Funktionszeiger aufrufen, müssen Sie sicher sein, dass der Prototyp auf der aufrufenden Seite genau so ist, wie die Funktion definiert wurde.

Jetzt ist eine Funktionsdeklaration mit leeren Klammern nicht einmal ein Prototyp, also ist dies nicht der richtige Weg, es zu nennen. Der Hauptgrund ist, dass die Aufrufkonvention etwas anders ist, als Sie erwarten würden. Für () Funktionen gelten spezielle Regeln, dh schmale Typen werden in int, unsigned oder double konvertiert.

Nun, was Sie tun können, ist Speicher ein Funktionszeiger in pf wie Sie tun, aber dann würden Sie immer es konvertieren müssen wieder in den richtigen Funktionszeiger vor dem Aufruf, wie

((void (*)(int, int))pf)(a, b); 

Das ist kaum lesbar und viel fehlerträchtig. Sie sollten solche Gymnastik so viel wie möglich vermeiden.

Verwandte Themen