Как вызвать функцию перед возвращением в C? - PullRequest
1 голос
/ 20 марта 2009

Я пытаюсь выполнить что-то в конце функции непосредственно перед тем, как она возвращается к вызывающей стороне. Для этого я бы хотел переопределить возврат в определенном контексте. Поведение должно быть таким же, как __cyg_profile_func_exit, но я хотел бы активировать его только для некоторых функций.

Я не знаю, возможно ли использовать встроенные команды gcc или подобные вещи.

Спасибо.

Ответы [ 2 ]

9 голосов
/ 20 марта 2009

GCC имеет атрибут для этого, который вызывает функцию, когда автоматическая переменная выходит из области видимости, передавая ей адрес этой переменной

void cleanup_fn(int *p) {
    puts("cleanup called...");
}

void f(void) {
    int p __attribute__((cleanup(cleanup_fn)));
    puts("in f...");
}

int main(void) {
    puts("calling f...");
    f();
    puts("out of it...");
    return 0;
}

Выход:

calling f...
in f...
cleanup called...
out of it...
0 голосов
/ 20 марта 2009

Нет, не в С как таковом.

То, что вы могли бы сделать, это написать макрос #define ВОЗВРАТ:

#define RETURN(func) if(_DEBUG_) func; return ;
#define RETURNV(func, val) if(_DEBUG_) func; return val ;

(Внимание, вы, вероятно, хотите больше думать об охране особых случаев, чем я.)

В противном случае вам нужно было бы написать что-то, что исказило код за кулисами, что и делают профилировщики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...