2012-02-29 6 views
16

가능한 중복 : C에서이 복합 선언을 읽으려면 어떻게해야합니까?


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 형식의 'sig'인수를 인수로 취하는 함수에 대한 포인터 인 'func'의 두 인수를 취하는 함수입니다. 인수로 int를 취하고 void를 리턴하는 함수에 대한 포인터를 리턴합니다.

신호가 기능에 대한 포인터입니까?

+0

그러나 이것은 내가 혼란스러워하는 곳이다. http://www.joyofprogramming.com/Docs_ColumnArticles/36-JoP-Dec-09.pdf –

+0

'typedef int foo (void)': foo는 함수를 가리키는 포인터이다. , 당신은'foo x '를 할 수 있기 때문에 그것을 단축 할 수 있고 함수라고 말할 수 있습니다; x();' – Benoit

+0

@Benoit 답장으로 추가 할 수 있습니까? –

답변

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

@Amit - 아론의 경우, 그가'cdecl '에게 보낸 문자열은 여러분이 여러분의 질문에 쓴 것이 아닙니다. –

1

signal은 두 개의 매개 변수를 취하여 int을 매개 변수로 사용하여 void을 반환하는 함수에 대한 포인터를 반환하는 함수입니다. signal 걸리는

두 파라미터는 int 매개 변수로 int 소요 void를 반환하는 함수에 대한 포인터이다.

네, 설명과 전반적인 아이디어가 맞습니다. cdecl.org를 사용

3

, 당신은 함수로

선언 신호 (기능 (int와 int를 포인터) 무효 반환) 기능 (INT)에 대한 포인터를 반환 입력

에 대한 무효

반환을 얻을

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

즉, signal은 기능입니다. signal을 호출 한 결과는 void f(int) 함수에 대한 포인터입니다.

설명 : signal() 호출은 새로운 신호 처리기를 설치하고 이전 신호 처리기 (당신이 원하는 경우에 그래서 당신이 나중에 복원 할 수 있습니다) 반환합니다.

+0

하지만 내 맥락에서 그게 다른가요? –

+0

@Aaron - OP와 동일한 선언을 입력하지 않았습니다. –

+0

@ 존행 : 네 말이 맞아. 결정된. –

1

아니요. 신호는이 개 인수를 int 및 함수에 대한 포인터를 받아 함수에 대한 포인터를 반환

그것은 (IMO) 더 읽기 비슷합니다 (func 인수와 같은 서명.) :

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

GNU는'sighandler_t'를 호출하고, libc4와 libc5는'SignalHandler'를 호출하고 glibc는'sig_t'를 호출합니다. ;) – Gandaro

+0

코드 작성 방법입니다. "함수 포인터를 매개 변수로 사용하는 함수 포인터"처럼 모호한 것을 선언 할 때 typedef를 사용하지 않는다면, 당신은 사악하고 아마도 매우 어리 석다. – 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) 

// John의 답변을 참조하여 편집하십시오.

가장 왼쪽 식별자
+0

이제 신호가 함수에 대한 포인터입니까? –

+0

신호가 포인터를 반환하는 함수임을 알립니다. –

+0

그게 정말 혼란스럽고, 대답의 대부분은 포인터를 돌려주는 함수를 말하고 당신은 다르게 말하는 것입니다. –

관련 문제