2012-02-29 19 views
16

संभव डुप्लिकेट:
what's the meaning of this piece of code? void (*signal(int sig, void (*func)(int)))(int);मैं सी में इस जटिल घोषणा को कैसे पढ़ूं?

मैं नीचे एक जटिल घोषणा जो "signal.h" हेडर फाइल से लिए गए हैं, और घोषणा है।

void (*signal(int sig, void (*func)(int)))(int); 

अब, मैं इसे कैसे पार्स करूं?

सिग्नल दो तर्कों के 'एसआईजी' int टाइप और 'func' ले रहा है, जो कि एक तर्क के रूप में int को ले जाने वाला एक सूचक है और शून्य प्रकार देता है; यह तर्क के रूप में int लेने और शून्य लौटने के समारोह में एक सूचक देता है।

क्या यह ठीक है या सिग्नल कार्य करने के लिए एक सूचक है?

+0

लेकिन यह मैं कहाँ http://www.joyofprogramming.com/Docs_ColumnArticles/36-JoP-Dec-09.pdf से –

+0

'typedef int foo (शून्य)' भ्रमित हो गया है: foo कार्य करने के लिए एक सूचक है , लेकिन आप इसे शॉर्टकट कर सकते हैं और कह सकते हैं कि यह एक फ़ंक्शन है, क्योंकि आप 'foo x कर सकते हैं; एक्स(); ' – Benoit

+0

@ बेनोइट क्या आप इसे अपने उत्तर के रूप में जोड़ सकते हैं? –

उत्तर

59

वाम-पंथी पहचानकर्ता के साथ आरंभ और अपने तरीके से बाहर काम करते हैं, याद है कि [] और () बाँध * पहले, इसलिए *a[] संकेत की एक सरणी है, (*a)[], एक सरणी के लिए सूचक है *f() एक सूचक वाला फ़ंक्शन है, और (*f)() एक समारोह के लिए सूचक है:

 signal          -- signal 
     signal(      )   -- is a function 
     signal( sig,     )   -- with a parameter named sig 
     signal(int sig,     )   -- of type int 
     signal(int sig,  func  )   -- and a parameter named func 
     signal(int sig,  (*func) )   -- which is a pointer 
     signal(int sig,  (*func)( ))   -- to a function 
     signal(int sig,  (*func)(int))   --  taking an int parameter 
     signal(int sig, void (*func)(int))   --  and returning void 
     *signal(int sig, void (*func)(int))   -- returning a pointer 
    (*signal(int sig, void (*func)(int)))( ) -- to a function 
    (*signal(int sig, void (*func)(int)))(int) -- taking an int parameter 
void (*signal(int sig, void (*func)(int)))(int); -- and returning void 

signal सहयोगियों एक संकेत sig के साथ एक संकेत हैंडलर समारोह func, और पुराने संकेत हैंडलर कार्य करने के लिए सूचक रिटर्न:

void new_interrupt_handler(int sig) 
{ 
    ... // do something interesting with interrupt signal 
} 

int main(void) 
{ 
    void (*old_interrupt_handler)(int); 
    ... 
    /** 
    * Set up our new interrupt handler 
    */ 
    old_interrupt_handler = signal(SIGINT, new_interrupt_handler); 
    ... 
    /** 
    * Restore original interrupt handler 
    */ 
    signal(SIGINT, old_interrupt_handler); 
    ... 
} 
+4

+1 बहुत अच्छा, चरण-दर-चरण स्पष्टीकरण। – watbywbarif

+0

धन्यवाद @ जॉन आपके विचारों के लिए, लेकिन यहां कुछ उपयोगकर्ता इसका विरोध करते हैं और संकेत कहते हैं कि काम करने के लिए सूचक है। –

+0

@ प्रवेश - हारून के मामले में, वह जिस स्ट्रिंग को 'cdecl' से खिलाया गया वह वह नहीं है जिसे आपने अपने प्रश्न में लिखा था। –

1

signal एक समारोह जो दो पैरामीटर लेता है और एक समारोह जो पैरामीटर के रूप में एक int लेता है और void रिटर्न के लिए सूचक रिटर्न है।

दो पैरामीटर कि signal लेता है एक int और एक समारोह जो एक पैरामीटर के रूप int लेता है और void रिटर्न के लिए सूचक है।

और हाँ, आपको विवरण और समग्र विचार सही मिला।

3

cdecl.org का उपयोग करके आप समारोह के रूप में

घोषित संकेत (पूर्णांक, समारोह (पूर्णांक सूचक) शून्य लौटने) समारोह (int) करने के लिए सूचक लौटने इनपुट

के लिए लौटने शून्य

मिल

void (*signal(int, void(*)(int)))(int) 

इसका मतलब है signal एक कार्य है। signal पर कॉल करने का परिणाम void f(int) फ़ंक्शन पर पॉइंटर है।

स्पष्टीकरण: signal() कॉल एक नई संकेत हैंडलर स्थापित करता है और वर्ष संकेत हैंडलर (ताकि आप इसे बाद बहाल कर सकते हैं यदि आप चाहते हैं) देता है।

+0

लेकिन मेरे संदर्भ में यह अलग है, है ना? –

+0

@Aaron - आपने ओपी के रूप में एक ही घोषणा दर्ज नहीं की है। –

+0

@ जॉनबोड: आप सही हैं। फिक्स्ड। [Cdecl.org] से लिंक करने के लिए –

1

नहीं यह सही है। संकेत 2 तर्कों, एक पूर्णांक और एक समारोह के लिए एक सूचक लेता है और एक समारोह के लिए एक सूचक रिटर्न

यह (IMO) अधिक पठनीय के समान है (func तर्क के समान हस्ताक्षर से।):

typedef void (*sig_func)(int); 
sig_func signal(int sig, sig_func func); 
+0

जीएनयू इसे 'sighandler_t', libc4 और libc5 कहते हैं, इसे' सिग्नल हैंडलर 'कहते हैं और ग्लिबैक इसे' sig_t', बीटीडब्लू कहते हैं। ;) – Gandaro

+0

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

0
void (*signal(int, void (*)(int)))(int); 

     signal(    )   // signal is a function 
       int, void (*)(int)   // the parameter types of the function: 
              // an int and a function pointer (take int, return void) 
void (*       )(int); // the return type of the function: 
              // a function pointer (take int, return void) 

// जॉन के उत्तर का जिक्र करते हुए संपादित करें।

+0

अब काम करने के लिए सूचक संकेत कैसे है? –

+0

यह सिग्नल बताता है कि फ़ंक्शन रिटर्निंग पॉइंटर है। –

+0

अब यह वास्तव में भ्रमित है, ज्यादातर जवाब कहते हैं कि इसका फ़ंक्शन पॉइंटर लौटा रहा है और आप अलग कह रहे हैं। –

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