c - सी में लगातार फंक्शन पॉइंटर्स की सरणी कैसे घोषित करता है?




arrays pointers (4)

VisualStudio 2008 के साथ, मुझे मिल रहा है:

void (* const MESSAGE_HANDLERS[])(void) = {
   NULL,
   NULL
};

int main ()
{
    /* Gives error 
        '=' : left operand must be l-value
    */
    MESSAGE_HANDLERS = NULL;

    /* Gives error 
        l-value specifies const object
    */
    MESSAGE_HANDLERS[0] = NULL;
}

मुझे ऐसा कार्य करने के लिए पॉइंटर्स की सरणी को घोषित करना होगा:

extern void function1(void);
extern void function2(void);
...

void (*MESSAGE_HANDLERS[])(void) = {
   function1,
   function2,
   ...
};

हालांकि, मैं चाहता हूं कि सरणी को स्थिर के रूप में घोषित किया जाए- डेटा में सरणी और पॉइंटर दोनों डेटा। दुर्भाग्यवश, मुझे याद नहीं है कि कॉन्स्ट कुंजी-शब्द (एस) को कहां रखें

मैं वास्तविक पॉइंटर मान रहा हूँ, इस मामले में MESSAGE_HANDLERS पहले से स्थिर है क्योंकि यह एक सरणी के रूप में घोषित किया गया है। दूसरी ओर, अगर सरणी के भीतर फ़ंक्शन पॉइंटर्स रनटाइम पर बदलते हैं तो क्या इसे दिखाया गया घोषित किया जा सकता है?


cdecl कहते हैं:

cdecl> explain void (* const foo[])(void)
declare foo as array of const pointer to function (void) returning void

क्या आपको इसकी ज़रूरत है?


इस तरह की परिस्थितियों में, अपने फ़ंक्शन हस्ताक्षर के नाम पर एक typedef करें, जो इसे बहुत आसान बना देता है:

typedef void MESSAGE_HANDLER(void);

उस जगह के साथ, यह सिर्फ होना चाहिए:

MESSAGE_HANDLER * const handlers[] = { function1, function2 };

सरणी निरंतर की वास्तविक सामग्री प्राप्त करने के लिए

संपादित करें : typedef गए typedef से पॉइंटर को निकाल दिया गया, यह वाकई बेहतर है (लाइव और सीखें)।


मुझे यकीन नहीं है कि यह 'सी' में काम करेगा। यह 'सी ++' में काम करता है:

  • सबसे पहले एक प्रकार के रूप में MESSAGE_HANDLERS को परिभाषित करें:

    typedef void (*MESSAGE_HANDLER)();

  • उसके बाद, अपने सरणी को स्थिर करने के लिए प्रकार परिभाषा का उपयोग करें:

    MESSAGE_HANDLER const handlers[] = {function1, function2};

ट्रिक typedef , अगर आप 'सी' में एक ही शब्दार्थ से कर सकते हैं, तो उसे भी काम करना चाहिए।








function-pointers