2013-04-04 18 views
21

Aşağıda gösterilen kod satırına rastladım Sanırım boşluk döndüren ve geçersiz bir işaretçi alan bir işlev işaretçisine yayınlanmış olabilir, doğru mu?İşaretçi işlev için yayınlanıyor?

(void (*)(void *))SGENT_1_calc 
+0

döküm SGENT_1_calc funcname atanabilir Burada proto geçersiz iÅŸlev_ismi (void *) ile bir işleve atayabilirsiniz bir işlev işaretçisi void (void için void) fonksiyonu geri dönüyor –

cevap

29

Evet, doğru. Ben çok okunabilir değil bulmak, bu yüzden fonksiyonun imza işaret edilecek ilan öneriyorum:

typedef void sigrout_t(void*); 

Ben de var kodlama kongrerout_t ile biten türleri işlevleri imzalar için böyle tipleri olduğunu. Ben döküm am üzerinde _t Posix tarafından

ikincisi bir sonek reserved olduğundan belki

((sigrout_t*) SGENT_1_calc) (someptr); 
+1

Tipedef için ayrılan, tamamen katılıyorum. – Joe

+0

Bir yandan, yazım hatası gereksiz ve kafa karıştırıcı (en azından bazılarına) parantez gerekliliğini ortadan kaldırır. Diğer yandan, cast'in ne olduğunu anında belirleme yeteneğini azaltır. Oyuncunun bir işlev işaretçisine dönüştüğünü öğrenmek istiyorsanız, alternatifi sağlamak için sigrout_t öğesinin ... +1 olarak tanımlandığına bakmanız gerekir. – Sebivor

+0

_t ile biten isimler POSIX için ayrılmıştır, bkz. Http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html – satur9nine

0

Evet, belirttiğiniz gibi bir dökümdür.

4

Evet öyle, işlev bu

gibi bakıyor olmalıdır gibi adlandırmak, aksi Adını olabilir
void func(void*); 

Ancak, bir hedefin yokluğu işe yaramaz olduğu için ifadenin bir hedefi eksik. Bu yüzden

func = (void (*)(void *))SGENT_1_calc; 
0

gibi olmalıdır evet onun size SGENT_1_calc doğrudan pointer içine

İlgili konular