2016-10-27 1 views
0

Я хочу написать функцию hook, которая вызывается всякий раз, когда в моей программе вызывается функция для сбора статистики о аргументах функции. Например:Как написать общий крючок для функций в C?

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

Так вместо вызова foo непосредственно, он будет вызывать крюк вместо с foo в качестве первого аргумента и 1, 2 в качестве дополнительных аргументов.

Есть ли что-нибудь подобное в C? Могу ли я достичь этой цели на С любым другим способом?

+0

В c вам нужно иметь указатель функции с многоточием в его подписи. –

+0

@ πάνταῥεῖ Код, который я написал, скорее псевдо-кода, чем реального. Я просто хочу знать, возможно ли это в 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

Макросы могут быть (аb), используемый для достижения этой цели упрощенно:

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

Смежные вопросы