2010-04-14 57 views
11

Aradım ama herhangi bir sonuç bulamadım (terminolojim kapalı olabilir) bu yüzden daha önce sorulmuşsa beni affet.Bir işlev işaretçisi bildirmeden işlev olarak void * çağrısı

Bir işlev göstergesini ilk önce bildirmeden ve işlev işaretçisi adresini atamadan, void*'u C işlevi olarak çağırmanın kolay bir yolu olup olmadığını merak ediyordum;

ie. çağrılacak işlevi varsayarak, ben hata C2066 olsun yukarıdaki kod ile void(void)

void *ptr; 
ptr = <some address>; 
((void*())ptr)(); /* call ptr as function here */ 

yazmaktır: tipini çalışması için dökme

bu mümkün değilse VC2008

illegal
, nasıl sözdizimi farklı olurdu Dönüş tipli ve çok parametreli fonksiyonlar için?

cevap

22

Kişisel dökme olmalıdır: Bu fonksiyon işaretçisi türü typedef daha kolay ve daha okunabilir olduğunu Genelde

((void (*)(void)) ptr)(); 

bu işlev işaretçisi türü için typedef oluşturarak basit yapılabilir:

typedef void (*func_type)(void); 
((func_type) ptr)(); 

Ancak, bir işlev göstericisine normal bir işaretçiyi (nesneye işaretçisi) bir işlev göstericisine (veya bu nesneye) göndermenin kesinlikle yasal olmadığını belirtmek gerekir. ommon uzantısı). C++

+0

Sadece aradığım şey, teşekkürler. –

12

İşlev türlerine göre döküm yaparken çok karışıkım.

void *ptr = ...; 
typedef void (*void_f)(void); 
((void_f)ptr)(); 
11

: reinterpret_cast< void(*)() > (ptr)()

reinterpret_cast kullanımı size kafa karıştırıcı parantez grubu kaydeder ve < > açıkça çağrı kendisi dışında türünü belirler.

İlgili konular