본문으로 바로가기

함수 포인트, Function Point, 동적 함수호출,임의의 함수 호출

  • 함수 포인터 란?
    C언어의 포인터가 데이터의 위치를 가리키는 대신 함수 포인터는 함수를 가리키는 것입니다.
    포인터는 세그먼트 폴트를 유발하는(?) 단점이 있지만, 잘 활용한다면 C언어만의 장점이 됩니다.
  • 사용 용도 및 활용 방안:
    Generic 함수를 만들어서 사용 및 관리가 용의하게 코딩이 가능합니다.
    또한, 범용 함수기 때문에 코드에 대한 이해도를 높히는 부가적인 효과도 있습니다.
  • 1. 함수를 호출할 이름을 정의 함.
        #define DEFINE_FUNC_NAME "func_name"
  • 2. 함수 포인터 선언
       함수 이름을 포인터 타입으로 해야 합니다.
       그리고, 괄호로 묶는 위치도 신경써야 합니다.
       typedef int (*OptFunc)(int argument1, char *argument2);
       typedef: Type을 선언
       int (*OptFunc) :int를 리턴받는 OptFunc이라는 함수 포인터 
        (int argument1, char *argument2); argument의 갯수 및 자료형 지정 
  • 3. 실제로 호출 될 함수 정의
      위에서 선언한 함수에 의해 실제로 호출 될 함수 입니다. static 으로 선언되어야 합니다.
      static int FuncName(int argument1, char *argument2)
     { 
       . ..
     
     }
  • 4. 함수 포인터 대입 및 호출
    OptFunc func=FuncName; //정의된 함수 포인터에 실제 호출될 함수 부분의 이름을 대입.

    func(argument1, argument2); //와 같이 사용하면 곧바로 FuncName(int argument1, char *argument2) 이 실행 됩니다

사용 예)

  • 함수 포인터 구조체 정의 
    예제로 이름, 변수, 함수 세가지만 정의했습니다.
    실제 사용할 때 기본이 되는 구조입니다.
    typedef struct _OptFunc
    {
    const char *name;
    int arg;
    OptFunc func;
    } FuncPointer;

 

  • . 함수 포인터 구조체에 값 설정
    함수를 여러개 설정 해서 사용할 것이므로 배열로 잡아줍니다.
    위에서 정의한 구조체의 순서에 따라 name, arg, func에 각각 매핑 됩니다.
    다시 말해서..
    name DEFINE_FUNC_NAME으로 설정 해줍니다. , "func_name"이 되겠죠
    arg 1 로 설정 해줍니다.
    func FuncName을 가리키게 되겠죠.
    static const FuncPointer options[] =
    {
        { DEFINE_FUNC_NAME, 1, FuncName },
        { NULL, 0, 0, NULL }
    };

 

  • 함수 호출
    함수 포인터에 정의된 함수를 찾아서 Argument와 함께 호출 합니다.
    toks[0] "func_name"이면 FuncName 함수가 호출 되는 구조입니다.
    , 입력을 받아 특정 함수만 호출 하도록 구현하시면 됩니다.
    for (i = 0; options[i].name != NULL; i++)
    {
         if (strcasecmp(toks[0], options[i].name) == 0)
         {
           options[i].func(argument1, argument2);
         }
    }

 

  • 추가 예)

) long Function(arg) 과 같은 Long Type

           typedef long(*pf_DeviceQuery)(ITDeviceMap** );     

           typedef long(*pf_ClassQuery)(IActionList** );         

           typedef long(*CALLFUNC)(IActionUMD** ,long );

         typedef long(__cdecl *CALLFDIAGFUNCTION)(int);

) long __stdcall Function(arg) 과 같은 Long Type VB에서 호출하는 방식

      typedef long(__stdcall *pf_vbClassQuery)(IActionList** );//VB에서 호출하기 위한 규약

  ) void Function(arg) 과 같은 void return  Type

           typedef void (*pfThreadConnection)(LPVOID lpParam);

           typedef void(__cdecl *CALLSHOWSTATUS)(CString, COLORREF , int);

           typedef void(__cdecl *RUN_ITEM)(CString);          

         typedef void(*Function_point)(); //void return ,void arg