2016-06-04 14 views
5

Zakładając, że wszystkie funkcje współdzielą ten sam typ zwracania, czy można wywoływać każdą z nich za pomocą "ogólnego" wskaźnika funkcji, który jest zadeklarowany za pomocą pustych nawiasów (a więc nie określa jego argumentów)?Czy dozwolone jest wywoływanie funkcji z różnymi prototypami za pomocą pseudogenericowego wskaźnika funkcji?

Oto przykładowy kod, który ilustruje go:

#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

Możliwy duplikat [wskaźnika funkcji bez typów argumentów?] (Http://stackoverflow.com/questions/20835534/function-pointer- bezargumentowych-typów) –

+0

Interesujące pytanie. Prawidłowe jak w "czy kompiluje się i działa zgodnie z oczekiwaniami?" tak, czy mówi "kompilacja z' -Wall' działa bez ostrzeżeń? " na moich kompilatorach tak :-) – Dilettant

+0

Tak, bez ostrzeżenia nawet w trybie paranoicznym '-Wall-Wextra -pedantic -Wconversion' przez GCC 4.9 ... @Dilettant – alk

Odpowiedz

6

można zrobić podobny materiał, ale nie dokładnie w ten sposób. Kiedy wywołujesz funkcję za pomocą wskaźnika funkcji, musisz mieć pewność, że prototyp po stronie wywołującej jest dokładnie taki, jak zdefiniowano funkcję.

Teraz deklaracje funkcji z pustym nawiasem nie są nawet prototypem, więc nie jest to właściwy sposób wywoływania tego. Głównym powodem jest to, że konwencja telefonowania może się nieznacznie różnić od oczekiwanej. Dla funkcji () obowiązują specjalne zasady, mianowicie typy wąskie są konwertowane na int, unsigned lub double.

Teraz to, co można zrobić, to sklep wskaźnik funkcji w pf, jak to zrobić, ale wtedy zawsze musisz przekonwertować go z powrotem do właściwego wskaźnika funkcji przed wywołaniem, jak

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

Jest to ledwo czytelne i ma wiele błędów. Powinieneś unikać takiej gimnastyki, jak tylko możesz.

Powiązane problemy