2016-06-04 18 views
5

Tüm işlevlerin aynı döndürme türünü paylaştığını varsayarsak, her biri bir "genel" işlev işaretçisi tarafından çağrılan, boş parantezlerle bildirilen (bu nedenle argümanlarını belirtmez) geçerli midir? Tam olarak bu şekildeBu, farklı bir prototiple işlevlerini bir sözde genel işlev işaretçisi ile çağırmasına izin veriliyor mu?

#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

Olası çoğaltılabilir [İşlev işaretçisi bağımsız değişken türleri?] (Http://stackoverflow.com/questions/20835534/function-pointer-without-arguments-types) –

+0

İlginç soru. "Olduğu gibi derleme ve beklendiği gibi çalışır?" evet, "-Wall" ile uyarı yazmadan "derler mi?" derleyicilerimde evet :-) – Dilettant

+0

Evet, paranoyak modda bile uyarı yok '-Wampra -pedantic -Wconversion' GCC 4.9 ... @Dilettant – alk

cevap

6

Sen benzer şeyler olabilir, ama değil: İşte

o kadar gösterir, örnek bir koddur. Bir işlev işaretçisi aracılığıyla bir işlevi çağırdığınızda, çağıran taraftaki prototipin, işlevin tam olarak tanımlandığından emin olmanız gerekir.

Artık boş parantezli bir işlev bildirimleri bir prototip bile değil, bu yüzden bu, onu aramak için doğru yol değil. Temel neden, çağrı sözleşmesinin beklediğinizden biraz farklı olabileceğidir. () fonksiyonları için özel kurallar geçerlidir, yani dar tipler int, unsigned veya double'a dönüştürülür. Eğer yapabileceklerinden Şimdi

mağazapf bir işlev işaretçisi yapmanız gibidir, ancak o zaman hep böyle

((void (*)(int, int))pf)(a, b); 
olarak, çağrı öncesinde doğru işlev işaretçisi geri dönüştürmek zorundayız

Bu, neredeyse okunabilir ve çok hata görüyor. Yapabildiğiniz kadar jimnastikten kaçınmalısınız.

İlgili konular