설명 #
"함수포인터"는 C언어에서 자주 쓰이는 기본 용법중 하나입니다. 정의는 다음과 같습니다.
선언된 함수가 저장된 메모리 번지값을 담고 있는 포인터 변수하지만 이것을 왜 보통의 포인터와는 달리 특별취급하냐면 다음과 같은 이유 때문입니다.
- 일반 포인터 변수와는 조금 다르게 보이는 문법으로 선언됩니다. 예를 들어 함수 포인터 변수는 다음과 같이 선언합니다. (functionPtr이 포인터 변수명이 됩니다)
void (*functionPtr)(const char *s_)
- 함수포인터는 실행부분을 가리키는 포인터 변수인탓에 () 연산자를 사용할 수 있습니다. 즉, 위의 functionPtr은 아래와 같이 실행가능합니다.
functionPtr("바보나라~")
예제 #
아래 예제는 함수포인터를 활용한 간단한 예제입니다.
#include <stdio.h>
void testout1(const char *s) {
printf("시험출력1:%s\n", s);
}
void testout2(const char *s) {
printf("시험출력2:%s\n", s);
}
// 함수포인터 변수
void (*funcPtr)(const char *s);
int main() {
// 함수포인터를 testout1, testout2로 각각 대입해보고 실행해본다.
funcPtr = testout1;
funcPtr("테스트");
funcPtr = testout2;
funcPtr("테스트");
}
void testout1(const char *s) {
printf("시험출력1:%s\n", s);
}
void testout2(const char *s) {
printf("시험출력2:%s\n", s);
}
// 함수포인터 변수
void (*funcPtr)(const char *s);
int main() {
// 함수포인터를 testout1, testout2로 각각 대입해보고 실행해본다.
funcPtr = testout1;
funcPtr("테스트");
funcPtr = testout2;
funcPtr("테스트");
}
실행결과는 아래와 같습니다.
시험출력1:테스트 시험출력2:테스트
main()안에서는 funcPtr만 실행했지만 마치 testout1, testout2를 각각 실행한 것과 같은 효과가 있음을 알 수 있습니다.
typedef 거는 법 #
함수포인터를 어떤 포인터 변수로서 활용하고 싶을 때 typedef를 활용하면 매우 편리합니다. 실제로 win32 API에서는 윈도우 프로시저 함수포인터형으로 WNDPROC라는 타입이 있습니다. (이부분을 보면 어느정도 사용법에 대한 느낌이 올겁니다) winuser.h 헤더화일에서 검색해보면 다음과 같이 선언되어있습니다.
typedef LRESULT(CALLBACK *WNDPROC)(HWND,UINT,WPARAM,LPARAM);
실제로 사용될 때에는 다음과 같이 사용됩니다.
LRESULT CALLBACK winproc1(HWND,UINT,WPARAM,LPARAM) { }; ... WNDPROC winprocPtr = winproc1; ...
꽤 유용한 문법이니 알아두시면 좋습니다.
주의사항 #
함수포인터는 알아두면 상당히 유용한 기법이지만 사용시에는 다음과 같은 부분을 주의해야합니다.
- 대입되지 않은 (NULL값상태의) 함수포인터를 실행하지 않도록 주의해야합니다. 초기화를 항상 NULL로 해두고 실행전에 검사하는 것도 좋은 방법입니다.
- "같은 함수 포인터 타입"이라는 것을 증명하려면, 반환값, 매개변수의 타입 및 개수가 모두 일치해야합니다. 보통 하나라도 다른 함수포인터값을 대입하면 컴파일시 오류가 나게 됩니다.
출처 : http://www.redwiki.net/wiki/wiki.php/%C7%D4%BC%F6%C6%F7%C0%CE%C5%CD
'C/C++언어' 카테고리의 다른 글
[C/C++] Debug Printf (0) | 2012.01.03 |
---|---|
어셈블리 코드도 #if같은 메크로 분기시켜서 소스 관리하기. (0) | 2011.05.27 |
Doxygen을 사용한 코드 문서 쉽게 생성하기 (0) | 2010.07.04 |
상속, 함수 재정의(function overriding) (0) | 2010.07.04 |
함수를 매개변수로 하는 소스예제 (0) | 2008.07.28 |