2009-04-05 17 views
9

मेरे पास एक सी फ़ंक्शन है जो फ़ंक्शन पॉइंटर को तर्क के रूप में लेता है, यह एक विनाशक है जिसे मैं अपने प्रोग्राम के अंत में कॉल करूंगा। यहाँ मेरी समारोह के प्रोटोटाइप है:सी: फ़ंक्शन पॉइंटर और टाइपपीफ समस्या

int store_dest(void (*routine)(void *)); 

मैं कुछ अन्य infos के साथ एक संरचना में इस समारोह सूचक संग्रहीत करना चाहते हैं। एक अच्छी संरचना के लिए, मैं इस फ़ंक्शन पॉइंटर को टाइपिफ़ करना चाहता हूं। यहाँ मेरी typedef है: यहाँ

typedef void (*my_destructor)(void *); 

और मेरे संरचना होती है:

typedef struct my_struct{ 
    my_destructor dest; 
    other_info ... 
} my_struct; 

, मैं मेरा एक समारोह "गंतव्य" फ़ील्ड सेट करना चाहते हैं आरंभीकरण चरण के दौरान, यहाँ के प्रोटोटाइप है इस समारोह:

void* my_dummy_dest(void* foo); 

समस्या (वास्तव में यह सिर्फ एक चेतावनी लेकिन मैं इसे दबाना पसंद है) तब होता है जब मैं अपने संरचना के लिए "my_dummy_dest" "गंतव्य" फ़ील्ड सेट करने का प्रयास करें:

एक डाली का अभाव अलग सूचक प्रकार की तुलना: जब मैं सिर्फ उनकी तुलना

ही: "असंगत सूचक प्रकार से काम चेतावनी":

if (my_struct.dest == &my_dummy_dest) 

मैं एक "चेतावनी मिलती है

my_struct.dest = &my_dummy_dest; 

मैं एक मिल "

लेकिन जब मैं" dest "फ़ील्ड को किसी अन्य दिनचर्या के साथ सेट करता हूं तो मुझे कोई चेतावनी नहीं मिलती है। मुझे नहीं पता कि मेरे पास उन चेतावनियां क्यों हैं।

उत्तर

11

आपके डमी विनाशक को एक शून्य सूचक वापस करने के लिए घोषित किया गया है, शून्य नहीं। यह घोषणा आपके विनाशक फ़ंक्शन पॉइंटर के लिए टाइपपीफ से मेल नहीं खाती है।

+0

oups, मुझे पता था कि यह कुछ बेवकूफ था, वैसे भी धन्यवाद :) – claf

5

typedef होना चाहिए:

typedef void *(*my_destructor)(void *); 
5

क्योंकि my_dummy_test रिटर्न शून्य * शून्य के बजाय। यदि आप शून्य * वापस करना चाहते हैं, तो टाइपपीफ

typedef void* (*my_destructor)(void *); 
संबंधित मुद्दे