시그널 함수 signal의 선언문이 잘 이해되지 않습니다.
글쓴이: dltkddyd / 작성시간: 화, 2013/02/12 - 1:25오후
#include <signal.h> void (*signal(int signum,void(*sighandler)(int)))(int);
시그널 함수의 원형이 저 위와 같다네요. 이 함수를 보건데, void(*sighandler)(int)는 분명 포인터 함수라서, 함수이름을 인자로 받을 수 있는 매개변수라는 것을 알 수 있습니다. 그런데 이해가 안 되는 부분은
void (*signal(...))(int)
에서 뒤에 있는 int 라는 부분입니다. 도대체 저 int가 왜 있는거죠? 그리고 바로 위에 언급한 함수도 포인터 함수라기에 전 이런 식이어야 한다고 생각했습니다.
void ((*singal)(...))
그런데 원형에서의 함수는 그게 아니네요. 원형에서의 signal은 다른 함수로 대체될 수 없는 형태인 것 같은데요.
Forums:
차라리 그럴 바에야
void singal(int signum, void(*sighandler)(int));
이런 식이 보다 간결한 표현이 아닐지요?
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
이건 signal 함수의 반환형이 void 인
이건 signal 함수의 반환형이 void 인 거고,
본문의 것은 signal 함수의 반환형이 "(int)를 인자로 받고 리턴타입이 void인 함수의 포인터"죠.
좋은 하루 되세요!
C 고급 문법: 복잡한 선언
선언 분석은 이름을 기준으로 오른쪽에서 왼쪽으로 번갈아 진행하는데 다음과 같은 방식입니다.
위 함수는,
(int 타입 인자와 "(int 타입 인자)를 받고 값을 반환하지 않는 함수"의 포인터 타입 인자)를 받아
"(int 타입 인자)를 받아 값을 반환하지 않는 함수"의 포인터를 반환
하는 함수입니다.
dcl이라는 선언 분석 프로그램을 이용해 결과를 확인하면 다음과 같이 됩니다.
signal: function(int, void (*)(int)) returning pointer to function(int) returning void
signal을 배운 적이 없지만, 이 함수는 내부적으로든 외부적으로든
void (*)(int) 타입의 값을 반환해야 하고, 이를 이용하는 것으로 보이니
값을 반환하지 않는 void 타입으로 반환형을 정하는 것도 말이 안 될 테지요.
위 내용은 The C Programming Language - Kernighan & Ritchie에 소개된 내용입니다.
163쪽의 "복잡한 선언문" 절에서 자세히 다루고 있으니 참조하세요.
저는 이렇게 생각했습니다.
그냥 사용하는 방식을 외우는 게 낫겠네요.
제 실력이 모자라서 잘 이해가 안됩니다. 답변 올리셨는데 죄송합니다.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
적당한 버블 정렬 예제입니다.
입력받은 인자로 함수를 결정해야 하는 경우를 예제로 만들어봤습니다.
복잡한 선언 자체에 대해 설명이 더 필요하시면 인터넷이나 다른 레퍼런스를 참조하시고,
이에 대해 이해가 됐다면 나중에 이해를 돕는 예제로 한 번 살펴보셔요.
저는 이렇게 생각했습니다.
제일 바깥쪽은 리턴 타입입니다. void
제일 바깥쪽은 리턴 타입입니다.
void (*)(int)
signal은 함수 이름.
signum은 첫번째 인자이름이고 int
sighandler는 두번째 인자이름인데
자료형이 void (*)(int)입니다.
typedef를 활용하면 가독성을 높힐 수 있죠
댓글 달기