SORU
28 Kasım 2010, Pazar


Typedef işlev işaretçisi?

Dinamik yük DLL öğreniyorum ama benim anlamadığım bu hat

typedef void (*FunctionFunc)();

Bir kaç sorum var. Eğer birisi onlara cevap mümkün olursa minnettar olurum.

  1. Neden typedef kullanılır?
  2. Sözdizimi garip görünüyor; void sonra işlev adı falan değil. İsimsiz bir fonksiyon gibi görünüyor.
  3. Bir işlev işaretçisi bir fonksiyonun bellek adresini saklamak için oluşturulur?

Şu an kafam karıştı. bana bazı şeyleri netleştirebilir misiniz?

CEVAP
28 Kasım 2010, Pazar


typedef bir dil associates bir türü için bir isim inşa etmek.

  typedef int myinteger;
  typedef char *mystring;
  typedef void (*myfunc)();

onlar gibi kullanarak

  myinteger i;   // is equivalent to    int i;
  mystring s;    // is the same as      char *s;
  myfunc f;      // compile equally as  void (*f)();

Gördüğünüz gibi, sadece tanım yukarıda verilen typedefed adını değiştirebilirsin.

Zorluk C ve C fonksiyonları sözdizimi ve okunabilirlik için işaretçiyi yatıyor , ve typedef Bu tür açıklamalar okunabilirlik artırabilir. Ancak, sözdizimi, fonksiyonlar - basit diğer türleri farklı olarak bir dönüş değeri ve parametreleri, işlev işaretçisi bazen uzun ve karmaşık Bildirgesi böylece olabilir beri uygun.

Okunabilirlik fonksiyonlar diziler ve daha başka dolaylı tatlar işaretçiler ile gerçekten zor olmaya başlayabilir.

Üç sorularınızı cevaplamak için

  • Neden typedef kullanılır? Fonksiyonları için kod - özellikle işaretçileri için okuma kolaylığı, ya da adlarının yapısı.

  • Sözdizimi tek işaretçi bildirimi fonksiyonu için () görünüyor Bu sözdizimi en azından başında zaman açık okunmaz. Bunun yerine typedef bir bildirim kullanarak okumayı kolaylaştırır

  • Bir işlev işaretçisi bir fonksiyonun bellek adresini saklamak için oluşturulur? Evet, bir işlev işaretçisi bir işlev adresi saklar. Bu program typedef tek yazma kolaylığı inşa/okuma ile ilgisi yok ; derleyici sadece gerçek kodunu derlemeden önce typedef tanımını genişletir.

Örnek:

typedef int (*t_somefunc)(int,int);

int product(int u, int v) {
  return u*v;
}

t_somefunc afunc = &product;
...
int x2 = (*afunc)(123, 456); // call product() to calculate 123*456

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • super1988guy

    super1988guy

    9 Aralık 2007
  • THE RED DRAGON

    THE RED DRAG

    6 ŞUBAT 2009
  • Valdorsha

    Valdorsha

    8 Mayıs 2006