지속가능티끌/C . C++2015. 1. 11. 03:07

함수포인터

 

 

1. int Function(int a) {... } ; 로 정의된  함수가 있다치자.

 

2. 위 1의 함수의 포인터(함수이름이 포인터임)를 받을 수 있는 함수포인터 변수 pFunc 선언하고 1의 함수포인터를 대입하는 방법 

 int (*pFunc)(int) = Function; 

 

3. 2처럼 대입하고나서, pFunc(1); 이라고 호출하면 Function(1); 이 호출되는 것임.

 

4. 1의 함수를  다른 함수 "myfunc" 의 입력인자 로 전달하기 위한 다른 함수 "myfunc" 정의 방법.

void myfunc( int (*pFunc)(int) )

{

   pFunc(1);

}

myfunc 호출시 상기1의 함수를 인자로 전달하는 법 : myfunc(Function);

 

5. 상기2와 같은 함수포인터 변수를 사용자 타입정의하는 법..

typedef int(*pFunc)(int);

 

6. 상기 5에서 선언된 타입으로 변수 선언하는법.

pFunc my_pfunc1;

pFunc my_pfunc2;

 

7. 상기 5에서의 사용자 정의 타입으로 상기 4의 함수포인터 전달하는 인자 부분 변경하면,

 

void myfunc( pFunc p_func )

{

p_func(1);

}

mufunc 호출시 상기1의 함수를 인자로 전달하는 법 : myfunc(Function);

 

 

콜백개념

 

 

8. "이곳"에 있는 함수를 다른곳(예.  다른 클래스 개체, DLL등 )에 전달하여 다른 곳에서 "이곳"의 함수를 호출하는 법 <- 이런걸 콜백이라 부름.

"다른 곳"으로 "이 곳"의 함수를 전달하고 "다른 곳"에서 "이곳"의 함수를 호출하게 하는 것.

 

"다른 곳" 코딩.

 

typedef int(*pFunc)(int);

pFunc your_func;          // "이 곳"의 함수를 받을 함수포인터변수 선언이다.

 

//"이 곳"의 함수포인터로 인자를 전달하면 your_func 으로 대입해두는 함수.

void regi_func(pFunc p_func)

{

  your_func = p_func;  // 인자로 전달받은 함수포인터를 your_func 에 대입했다.

}

//

void exec_func()

{

 your_func(1);  // regi_func 의 인자로 전달된 함수가 실행되는 것임.

}

 

"이곳 " 코딩.

이곳에는 int Function(int a) {... } 함수가 정의되어있는데 이 함수를 "다른 곳" 의 regi_func 을 호출하면서 함수포인터를 전달한다.

regi_func(Function);

 

작동방식 요약.- 콜백 작동 개념임.

위와 같이 Function 이라는 함수포인터는  "다른곳" 의 regi_func 의 인자로 전달하여 "다른곳"의 your_func 에 대입된다..  exec_func 실행될때 your_func 가 실행되는데 이것이 실제 실행되는 것은 "이곳"의 Function(1) 이 실행된 것이다.

 

 

주의사항.

- 위와같은 함수포인터 기반의 콜백구현시 "이곳"측의 함수는 클래스의 멤버함수를 전달하지 못하며, 클래스에서 static 함수만 전달가능한 단점이 있다.

static 함수이다 보니 함수내에서 클래스 멤버에 접근하지 못하여 불편한 경우가 자주 발생한다. static 함수내에서 클래스 멤버에 접근하지 않아도 되는 경우는 문제없이 사용가능하나, 범용적이지 못한 방법이라 콜백 구현하는 경우 위와 같은 함수 포인터 보다는 STL(Standard Template Library) 에서 제공하는 std::function, std::bind 를 이용하여 콜백구현하면 클래스 멤버 함수를 콜백함수로 구현가능하여 매우 편리하다.

STL 기반 콜백구현 상세설명 보기 -> http://igotit.tistory.com/213

 


 본 글이 포함된 상위 정리 장소.

 

 Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11

 




첫등록 : 2015년 1월11일

최종수정 : 


본 글 단축주소 : https://igotit.tistory.com/212







Posted by 리치굿맨

댓글을 달아 주세요

  1. 루갈반다

    콜백 개념 제대로 잡았습니다. 감사합니다.. 다른곳 여러군대 찾아가봐도 이해안되었는데.. 여기가 최고에요..

    2019.12.06 12:51 [ ADDR : EDIT/ DEL : REPLY ]
    • 넵 감사합니다.~~ 함수포인터와 콜백함수 도입하면 정말 깔끔한 체계적인 소스구조가 달성됩니다. 특히 임베디드 C 같은 경우 더 더욱 중요했어요. 함수 포인터 콜백 없이 코딩할 때와 비교해보면 때 방대한 프로젝트의 소스체계, 생산성 증대, 스트레스 감소 최소 모두 10배 이상 개선되었어요. ~

      2019.12.18 01:59 신고 [ ADDR : EDIT/ DEL ]
  2. 지나가다

    와! 깔끔하게 잘 정리해주셔서 이해하기 정말 좋았습니다
    좋은 자료 감사합니다!

    2021.10.04 17:52 [ ADDR : EDIT/ DEL : REPLY ]