typedef関数ポインタの使い方

4300 ワード

コードの簡略化、プラットフォーム間開発の目的を促進する.
typedefの動作は、同義語の代わりに実際のタイプのdefineマクロに似ています.
異なる点:typedefはコンパイル時に解釈されるため、コンパイラにプリプロセッサの能力を超えたテキスト置換に対処させる.
使用方法1:
typedef int (*MYFUN)(int, int);このような用法は一般的に関数に別名を定義する際の上の例でMYFUNを定義する関数ポインタとして用いられ、関数タイプは2つのintパラメータを持つ、1つのintを返すこの形式の定義を分析する際に以下の方法を用いることができる:typedefと別名を先に削除し、残りは元の変数のタイプである.typedefとMYFUNを外すと残り:int(*)(int,int)
使用法2:
typedefは変数タイプに別名を定義する.
typedef struct{ int a; int b; }MY_TYPE;ここでは、MYという名前の構造を直接取りました.TYPEの別名です.構造のインスタンスを定義したい場合は、MY_TYPE tmp;
2つ目の使い方:typedef元変数タイプ別名
typedef補足内容:
例:
  typedef int (*PF) (const char *, const char *);
この宣言は、2つのconst char*タイプのパラメータとintタイプの戻り値を持つ関数ポインタの同義語としてPFタイプを導入した.
簡単な関数ポインタの使い方
//形式1:戻りタイプ(*関数名)(パラメータテーブル)
char(*pFun)(int);
char glFun(int a){return;}
void main()
{
pFun =glFun;
(*pFun)(2);
}
1行目はポインタ変数pFunを定義する.ある関数を指すポインタです.この関数パラメータはintタイプで、戻り値はcharタイプです.最初の文だけはこのポインタを使用できません.まだ値を付けていないからです.
2行目は関数glFun()を定義する.この関数はintをパラメータとしてcharを返す関数です.ポインタの階層から関数-関数の関数名を理解するには、メモリ内の関数のコードの最初のアドレスを指すポインタです.
typedefを使用するとより直接的です
typedef char(*PTRFUN)(int)
PTRFUN pFun;
char glFun(int a){return;}
void main()
{
pFun = glFun;
(*pFun)(2);
}
typedefの機能は、新しいタイプを定義することです.最初の文はPTRFUNのタイプを定義し、intをパラメータとしてcharタイプを返す関数を指すポインタとして定義します.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
次に例を示します.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedefの使用で最も面倒なのは関数を指すポインタですが、次の関数がなければ、次の式の定義とどのように使用するか知っていますか.
int (*s_calc_func(char op))(int, int);
わからない場合は、下記の手順をご覧ください.
//四つの関数の定義
int add(int, int);
int sub(int, int);
int mul(int, int);
int div(int, int);
//これらの関数へのポインタの定義
typedef int (*FP_CALC)(int, int);
//ご紹介はさせていただきませんが、次の行の内容はわかりますか?
int (*s_calc_func(char op))(int, int);
//次の行の内容は前の行と全く同じで、
//関数を定義するcalc_funcは、操作文字opに基づいて対応する計算関数を指すポインタを返す
FP_CALC calc_func(char op);
//opから該当する計算結果値を返す
int calc(int a, int b, char op);
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int mul(int a, int b)
{
    return a * b;
}
int div(int a, int b)
{
    return b? a/b : -1;
}
//この関数の用途は、次の関数ジョブや呼び出し方法と全く同じです.
//パラメータはopで、最後の2つの整形ではありません
int (*s_calc_func(char op)) (int, int)
{
    return calc_func(op);
}
FP_CALC calc_func(char op)
{
    switch (op)
    {
    case '+': return add;
    case '-': return sub;
    case '*': return mul;
    case '/': return div;
    default:
        return NULL;
    }
    return NULL;
}
int calc(int a, int b, char op)
{
     FP_CALC fp = calc_func(op);//次に、同様の直接定義指向関数ポインタ変数を示します.
//次の行はtypedefを使わずに関数を指すポインタを実現する例です.面倒です.
        int (*s_fp)(int, int) = s_calc_func(op);
       //ASSERT(fp == s_fp);//この二つは等しいと断言できる
      if (fp) return fp(a, b);
     else return -1;
}
void test_fun()
{
    int a = 100, b = 20;
    printf("calc(%d, %d, %c) = %d", a, b, '+', calc(a, b, '+'));
    printf("calc(%d, %d, %c) = %d", a, b, '-', calc(a, b, '-'));
    printf("calc(%d, %d, %c) = %d", a, b, '*', calc(a, b, '*'));
    printf("calc(%d, %d, %c) = %d", a, b, '/', calc(a, b, '/'));
}
実行結果
   calc(100, 20, +) = 120
   calc(100, 20, -) = 80
   calc(100, 20, *) = 2000
   calc(100, 20,/) = 5
回転元:http://hi.baidu.com/%C6%BF%D6%D0%B5%C4%C5%AE%CE%D7/blog/item/cc23b7252c592f3b8744f9e7.html
作者:Siobhan发表于2011-7-19 17:07:19
テキストリンク
読書:7コメント:0
コメントの表示