함수 포인터 란?

C언어의 포인터가 데이터의 위치를 가리키는 대신 함수 포인터는 함수를 가리키는 것입니다. 

포인터는 세그먼트 폴트를 유발하는(?) 단점이 있지만, 잘 활용한다면 C언어만의 장점이 됩니다. 


사용 용도 및 활용 방안:

Generic 함수를 만들어서 사용 및 관리가 용의하게 코딩이 가능합니다. 

또한, 범용 함수기 때문에 코드에 대한 이해도를 높히는 부가적인 효과도 있습니다. 




자.. 그럼 어떻게 사용해야 하는지 알아봅시다. 


이해를 돕고자 같은 녀석들 끼리 같은 색을 칠해두었습니다. 


1. 함수를 호출할 이름을 정의 함.


#define DEFINE_FUNC_NAME      "func_name"             



2. 함수 포인터 선언


함수 이름을 포인터 타입으로 해야 합니다. 

그리고, 괄호로 묶는 위치도 신경써야 합니다. 


typedef int (*OptFunc)(int argument1, char *argument2);



3. 실제로 호출 될 함수 정의 


위에서 선언한 함수에 의해 실제로 호출 될 함수 입니다. 


static int  FuncName(int argument1, char *argument2)

{

...

}



4. 함수 포인터 구조체 정의 

예제로 이름, 변수, 함수 세가지만 정의했습니다. 
실제 사용할 때 기본이 되는 구조입니다. 

typedef struct _OptFunc

{

    const char *name;

    int arg;

    OptFunc func;

} FuncPointer;



5. 함수 포인터 구조체에 값 설정 

함수를 여러개 설정 해서 사용할 것이므로 배열로 잡아줍니다. 
위에서 정의한 구조체의 순서에 따라 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 }   
};


6. 함수 호출  

함수 포인터에 정의된 함수를 찾아서 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);                   
}
}


Posted by KT한
,