sonumb

C Pointer - Extra 본문

개발자 이야기/C/C++

C Pointer - Extra

sonumb 2008. 2. 13. 18:23

이번 포인터는 보너스이다.
쪼금은 난해하다.

따라올려면 와도괜찮다.


함수 포인터를 인자로 받고 함수 포인터를 반환하는 함수: p

아 이게 무슨 마른 운영체제에 세그먼트폴트같은 소리인가.

예를 보자.

void (*signal(int signo, void (*func)(int) ))( int );
위의 함수는 유닉스의 시그널 함수라는 것이다.
시그널함수는 일종의 콜백함수이다..즉 어떤일을 동적으로 처리해달라는 거다.
설명은  그정도로만 하고 ,
위의 함수는 조금 `거시기`하다. 일반적으로 return funtion_name( parameter ); 의 문법과는 도통 매치가 되지 않는다. 왜냐하면... 그렇게 만들었기 때문이다. 문법을 만든 Geeks 두분의 생각일 뿐이다.-_-;

하지만!!! 알아보기 좋도록 간단하게 만들어볼 수 있다..
typedef void FUNCTION( int );
FUNCTION* signal( int signo, FUNCTION* func);

혹은

typedef void (*PFUNCTION)( int );
PFUNCTION  signal( int signo, PFUNCTION func);
이러면 좀 쉽다.
알아보기 좋도록 곱게곱게 고쳤다.
말그대로 함수포인터를 parmeter로 받고 함수포인터를 리턴한다.
더이상 쉽게 설명 불가하다. -_-;

extra의 extra:

밑의 쓰레기 코드를 함 보자!

char ( *func( char *(*strf[9])(void)) ) ( unsigned (**)(const char *) );

의문이 들것이다. `이거 해석가능한거임?`
해석은 가능하다.

Return value : char (*) ( unsigned (**)(const char *) )
즉 함수포인터를 리턴한다. unsigned를 리턴하고 const char*를 인자로 받는 함수 대한 함수이중포인터(이쯤되도 짜증이 난다)를 인자로 받고 char를 리턴하는 함수의 포인터 말이다. -_-;

이거 해석하는데 짜증난다.

Parameter : char *(*strf[9])(void)
포인터 배열이다. 그것도 함수포인터 배열이다.
char*를 리턴하고 인자가 없는 함수 말이다.

위에것 해석하는데도 짜증나는데 짜증이 배가 된다.
 

위의 함수 프로토타입은 쓰레기 코드다 . 말그대로. 천지 써먹을데 없으니 저런거에 모른다고 열받아 할 필요없다. (참고로 내가 이상한 놈이라서 그런다. -_-; )

하지만 고급프로그램을 짜고싶다면 위의 signal 함수의 원형정도는 해석할 줄 알아야겠다.

여담으로 컴파일러를 공부하고 나면 위의 코드를 해석하는데 도움이 많이 될 것이다.
(`LR파서`의 특징을 살펴봐라.)

반응형