2016-10-27 5 views
0

関数の引数に関するいくつかの統計情報を収集するために、プログラムで関数が呼び出されるたびに呼び出されるフック関数を書きたいと思います。たとえば:Cで関数の汎用フックを書くには?

void hook(function f, ...){ 
    //some statistics here 
    f(...); 
} 
int main(){ 
    foo(1, 2); 
} 

ので、代わりの直接fooを呼び出し、それは、最初の引数としてfooや余分な引数として1, 2で代わりにフックを呼び出します。

Cにはこれに類似するものはありますか?他の方法でCでこの目標を達成することはできますか?

+0

cでは、関数のポインタに省略記号を付ける必要があります。 –

+0

@πάνταῥεI私が書いたコードは、実際のコードよりも擬似コードのほうが多いです。私はこれがC言語で可能かどうかを知りたがっています。 – afsafzal

+2

GCCを使うと、 '-finstrument-functions'フラグを使ってコードを計測することができます。ただし、生成される関数は関数の引数リストを受け取らない。別のオプションは、プリプロセッサマクロを使用していますが、foo関数にコードを明示的に追加する必要があります。 –

答えて

-1

おそらくこれはあなたが探しているものですか?

typedef enum FunctionPointerType_E 
    { 
    FPT_Int_IntInt = 1 
    } FunctionPointerTypes_T 

int foo(
     int a, 
     int b 
    ) 
    { 
    return(a+b); 
    } 

void hook(
     FunctionPointerTypes_T fpt, 
     void (*function)(void), 
     ... 
    ) 
    { 
    int rCode; 
    int (*fp_Int_IntInt)(int, int); 

    switch(fpt) 
    { 
    case FPT_Int_IntInt: 
     fp_Int_IntInt = (int(*)(int, int))function; 
     rCode=(*fp_Int_IntInt)(1,2); 
    ... 
    } 

    return; 
    } 

void CallFooByRefrence(void) 
    { 
    hook(FPT_Int_IntInt, (void(*)(void))foo, ...); 
    return; 
    } 
+0

私は、このプログラム内のすべての機能で動作するフックを必要とします。だから私は関数の署名を指定する必要がない何かが必要です。 – afsafzal

+0

これにはさまざまな方法があります。参照によって呼び出すためには、通常、戻り値の型とパラメーターの型の表示が必要です。 (ソリューションを反映する答えを更新する) –

0

マクロ(AB)は、単純な方法でこれを達成するために使用することができます。

void foo(int , int); 

void Hook(int a , int b) 
{ 
    //do whatever 
    foo(a , b); 
} 

#define foo(a , b) Hook(a , b) 

int main(void) 
{ 
    foo(1 , 2); 
} 

注意これはエラーが発生しやすいですし、慎重な書き込みが必要であること。

+0

私はこのプログラム内のすべての関数で動作するフックを必要とします。 – afsafzal

+0

@afsafzalあなたは、それぞれの機能に対して異なるフックを書く必要があります。それが唯一の方法です。 – 2501

関連する問題