ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • function pointer
    bin/Linux 2007. 9. 18. 14:23
    - runtime 값으로 실행할 함수를 결정할 수 있다.
    - running program 은 main-memory 안에 임의의 위치를 갖는다.
    - 함수와 &함수가 같은 값을 갖는다.
    마치 배열에서 배열명이 첫요소의 첫번째 값을 나타내는 것과 같다
    - 관례적으로 fn 이름을 사용한다.

    * reference
    0. The Function Pointer Tutorials http://www.newty.de/fpt/index.html
    1. 함수포인터 한글 http://shinluckyarchive.tistory.com/206

    include/linux/fs.h
    typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned);
    filldir_t 데이타 타입을 int를 리턴하는 함수 포인터로 선언한다.

    * function pointer 선언
    Can you tell what the following declaration means? 
     void (*fn[10]) (void (*)() );

    Only few programmers can tell that p is an "array of 10 pointers to a function returning void and taking a pointer to another function that returns void and takes no arguments." The cumbersome syntax is nearly indecipherable. However, you can simplify it considerably by using typedef declarations. First, declare a typedef for "pointer to a function returning void and taking no arguments" as follows: 
     
      typedef void (*pfv)();

    Next, declare another typedef for "pointer to a function returning void and taking a pfv" based on the typedef we previously declared: 
     
      typedef void (*pf_taking_pfv) (pfv);

    Now that we have created the pf_taking_pfv typedef as a synonym for the unwieldy "pointer to a function returning void and taking a pfv", declaring an array of 10 such pointers is a breeze: 
     
      pf_taking_pfv p[10];
    Danny Kalev

    1) int (*x)(int, char *, void *);
    우선순위에 의해 포인터(*)를 먼저 해석하고 다음에 나오는 ()를 함수로 해석
    변수 x 는 포인터인데 이 포인터가 가르키는 곳에 int를 리턴하고 인자 ...를 갖는 함수가 존재한다.
    2) int (*x[10])(int, char *, void *);
    함수포인터 array 3) int (**x[10])(int, char *, void *)

    int myfunc(int a, char* b, void* c) 
    {
    return a;
    }

    void acallingfunction() 
    {
    int (*x)(int, char*, void*);
    x = myfunc;
    x(1, "hello", 0);
    }
    void anothercaller() 
    {
    int (*x)(int, char*, void*);
    int (**y)(int, char*, void*);
    x = myfunc;
    y = &x;
    (*y)(1, "hello", 0);
    }

    http://www.cdecl.org/
    void *(x)(int, int);
    declare x as function (int, int) returning pointer to void

    void *(*x)(int, int);
    declare x as pointer to function (int, int) returning pointer to void

    <소스코드 예제>
    - <linux-2.4>/drivers/char/lcd.c 
    static linkcheck_func_t linkcheck_callbacks[MAX_INTERFACES];
    - <linux-2.4>/drivers/char/nwbutton.c
    static struct button_callback button_callback_list[32];
    - <linux-2.6>/sound/isa/cmi8330.c
    typedef int (*snd_pcm_open_callback_t)(snd_pcm_substream_t *);

Designed by Tistory.