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

  • RocketJump

    RocketJump

    22 ŞUBAT 2006
  • Tahir Jahi

    Tahir Jahi

    6 Mart 2006
  • Tianna Sierra Dance

    Tianna Sierr

    16 EYLÜL 2013