2016-04-12 43 views
1
bildiren farklı bir yaklaşım

this (psikotik tarafından verilen yanıt) okurken, nasıl yazılacağını ve bir işlev işaretçisini çağırmayı anladım. Ama onlarla biraz deneyler ve ayrıca bu şekilde işlevleri çağırmak başardı typedefs düşündükten sonra:Bir işlevin işaretçisi -

typedef void func(unsigned char); 
void test(unsigned char a); 

int main() 
{ 
    unsigned char b=0U; 
    func *fp=&test; 
    while(1) 
    { 
     fp(b); 
     b++; 
    } 
} 

void test(unsigned char a) 
{ 
    printf("%d",a); 
} 

Ben fonksiyon işaretçisi sözdizimi ve bu yaklaşımı kullanarak arasındaki fark nedir alamadım? Her ikisi de hemen hemen aynı işlevselliği veriyor gibi görünüyor.

+2

İşlev göstergelerinin burada yer almadığı izlenimi uyandırıyor musunuz? Fonksiyon göstergeleri yapıyorsunuz; sadece biraz farklı bir sözdizimi. – user2357112

+6

Bir işlev gösterici değilse, func * fp' nedir? – WhozCraig

+0

Bu nasıl * "işlev gösterici olmadan" *? –

cevap

4

tarzı

typedef void func_t (void); 
... 
funct_t* fp; 

işlev işaretçileri ilan etmek en açık yollarından biridir. o C işaretçi sözdizimi geri kalanı ile tutarlıdır Temizle çünkü

O da çok daha az okunabilir eşdeğerdir Hangi biraz daha az okunabilir

typedef void (*func_t)(void); 
func_t fp; 

eşdeğerdir

void (*fp)(void); 

İlk stilin avantajı, bu parametreleri bir işlev olarak geçirdiğinizde belirgin hale gelir:

1) void sort (func_t* callback);  // very clear and readable! 
2) void sort (func_t callback);  // hmm what is this? passing by value? 
3) void sort (void(*callback)(void)); // unreadable mess 

Genellikle, yazım işaretlerinin arkasındaki işaretçi sözdizimini gizlemek kötü bir fikirdir. İşlev işaretçileri istisna değildir.

+0

Sanırım öyle. Çünkü UINT8 * u8ptr gibi bir şeyi 8 bit bellek türünü işaret eden bir işaretçi olarak yorumlamak çok kolay (veya alışmıştım). 1. durumunuz için eşdeğer fonksiyon gösterici sürümü şöyle yorumlanabilir: funct_t türüne işaret eden bir işaretçi (bu, hiçbir parametre almayan ve hiçbir şey döndürmeyen bir işlevdir). –

3

Sen

typedef void (*func)(unsigned char); 
func fp = &test; // Notice, no '*' in the declaration? 
+0

Yani sadece etrafta dolaşıyorum *. Sözdizimi hala typedef void (fonk) (imzasız char) için –

+0

kalır; – BlackMamba

1

, başka bir yol işaretçisi typedef olacaktır

func *fp = &test; // fp is a function pointer! 

yani ilanıyla bir işlev işaretçisi yaratıyor func Eğer işlev işaretçisi sonra ifadesi

olarak typedef ed vardı
func *fp=&test; 

func fp=&test;