2011-12-19 20 views
16

मैं एक हेडर फ़ाइल में फ़ंक्शन पॉइंटर घोषित करने के तरीके पर थोड़ा उलझन में हूं। मैं इसे मुख्य रूप से उपयोग करना चाहता हूं और मेनस.c नामक एक फ़ाइल का उपयोग करना चाहता हूं और इसे मेनू में घोषित करना चाहता हूं। मुझे लगता है। हम एक निश्चित कार्य को इंगित करने के लिए प्रारंभ करना चाहते हैं।शीर्षलेख और सी-फ़ाइल में फ़ंक्शन पॉइंटर घोषित कैसे करें?

यह इस तरह दिखता है:

void (*current_menu)(int); 

क्या हम आपकी नियति, menus.h और मुख्य में लिख सकता हूँ?

उत्तर

0

एक पॉइंटर फ़ंक्शन में फ़ंक्शन परिभाषा नहीं है। यह किसी प्रकार के पॉइंटर से अधिक कुछ नहीं है, फ़ंक्शन के रिटर्न प्रकार और पैरामीटर सूची द्वारा निर्दिष्ट किया जा रहा प्रकार। आपको एक ही पैरामीटर सूची और रिटर्न प्रकार के साथ फ़ंक्शन को परिभाषित करने की आवश्यकता है, फिर उस फ़ंक्शन के पते को पकड़ने के लिए अपने पॉइंटर फ़ंक्शन का उपयोग करें। फिर आप पॉइंटर के माध्यम से फ़ंक्शन को कॉल कर सकते हैं।

18

एक फ़ंक्शन पॉइंटर अभी भी एक सूचक है, जिसका अर्थ है कि यह अभी भी एक चर है।

यदि आप एक चर को कई स्रोत फ़ाइलों से दिखाना चाहते हैं, तो सबसे सरल समाधान यह है कि इसे कहीं और परिभाषा के साथ extern शीर्षलेख में घोषित करना है।

एक हैडर में:

extern void (*current_menu)(int); 

एक स्रोत फ़ाइल में:

void (*current_menu)(int) = &the_func_i_want; 
+0

ty, अब यह – user1106072

+2

काम करता है, एम्परसैंड सख्ती से आवश्यक नहीं है – Dave

+1

यह सच है, @ डेव। सी में, यह स्पष्टता के लिए मेरा एक स्टाइलिस्ट विकल्प है। सी ++ में कभी-कभी कुछ टेम्पलेट संदर्भों में इसकी आवश्यकता होती है, इसलिए मैं इसे स्थिरता के लिए करता हूं। –

6

यह समारोह संकेत के साथ typedef उपयोग करने के लिए अक्सर उपयोगी है ताकि आप कुछ वर्णनात्मक के प्रकार नाम कर सकते हैं :

typedef void (*MenuFunction)(int); 

तो फिर तुम इस प्रकार के एक वैश्विक चर, शायद आपकी नियति में menus.h में है, और घोषित (extern के साथ):

static void my_first_menu_function(int x) 
{ 
    printf("the menu function got %d\n", x); 
} 

MenuFunction current_menu = my_first_menu_function; 

main.c से, आप तो कर सकते हैं:

#include "menu.h" 

current_menu(4711); 

जो भी फ़ंक्शन वर्तमान में current_menu पर इंगित करता है उसे कॉल करने के लिए।

+0

बहुत सच है! यदि आपके पास बूस्ट या सी ++ 11 तक पहुंच है तो फ़ंक्शन 'भी उपलब्ध है। –

संबंधित मुद्दे