2011-02-23 17 views
31

समारोह संकेत के एरे इसलिए की तरह बनाया जा सकता है:एक अलग टाइपपीफ का उपयोग किए बिना फ़ंक्शन पॉइंटर्स की सरणी घोषित करने के लिए वाक्यविन्यास क्या है?

typedef void(*FunctionPointer)(); 
FunctionPointer functionPointers[] = {/* Stuff here */}; 

typedef का उपयोग किए बिना एक समारोह सूचक सरणी बनाने के लिए वाक्य रचना क्या है?

+7

दिलचस्प सवाल है, लेकिन "असली" कोड में आप सिर्फ समारोह संकेत के स्वर्ण नियम का पालन करना चाहिए: का उपयोग 'typedef' अन्यथा कोई भी अपने कोड को समझने में सक्षम हो जाएगा । ':)' –

उत्तर

62
arr //arr 
arr [] //is an array (so index it) 
* arr [] //of pointers (so dereference them) 
(* arr [])() //to functions taking nothing (so call them with()) 
void (* arr [])() //returning void 

तो आपका जवाब

void (* arr [])() = {}; 

है लेकिन स्वाभाविक रूप से, इस, बस typedefs :)

अतिरिक्त का उपयोग एक बुरी बात है: आश्चर्य है कि कैसे की एक सरणी घोषित करने के लिए दो पॉइंटर्स int लेने और दो पॉइंटर्स की सरणी में पॉइंटर वापस करने के लिए काम करने के लिए डबल और लौटने वाले कार्यों के लिए? (कैसे शांत है कि, है ना? :))

arr //arr 
arr [3] //is an array of 3 (index it) 
* arr [3] //pointers 
(* arr [3])(int) //to functions taking int (call it) and 
*(* arr [3])(int) //returning a pointer (dereference it) 
(*(* arr [3])(int))[4] //to an array of 4 
*(*(* arr [3])(int))[4] //pointers 
(*(*(* arr [3])(int))[4])(double) //to functions taking double and 
char (*(*(* arr [3])(int))[4])(double) //returning char 

:))

+15

+1, लेकिन इस तरह के मासोचिज्म के लिए cdecl.org है। ':)' –

+6

हे भगवान मेरी आंखें। @ _ @ – Maxpm

+0

धन्यवाद मैटेओ; cdecl.org एक भयानक साइट है! –

2

इस का उपयोग करें:

void (*FunctionPointers[])() = { }; 

वर्क्स सभी चीज़ों की तरह, आप के नाम के बाद [] जगह।

10

याद रखें "delcaration की नकल करता है का उपयोग करें"। तो कहा गया सरणी का उपयोग करने के लिए आप कहेंगे

(*FunctionPointers[0])(); 

सही? इसलिए यह घोषणा करने के लिए, आप एक ही उपयोग करें:

void (*FunctionPointers[])() = { ... };