2009-03-20 6 views
1

J'essaye d'exécuter quelque chose à la fin d'une fonction juste avant qu'elle ne retourne à l'appelant. Pour le faire, je voudrais remplacer le retour dans un certain contexte. Le comportement devrait être le même que __cyg_profile_func_exit, mais je voudrais l'activer uniquement pour certaines fonctions.Comment appeler une fonction juste avant de revenir en C?

Je ne sais pas si c'est possible d'utiliser des builtins gcc ou ce genre de choses.

Merci.

Répondre

0

Non, pas en C en soi.

Ce que vous pouvez faire est d'écrire une #define macro RETOUR: (. Attention, vous voulez probablement penser un peu plus sur la garde des cas particuliers que moi)

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

Dans le cas contraire, vous auriez besoin d'écrire quelque chose qui a déchiré le code dans les coulisses, ce que font les profileurs.

+0

ce que je pourrais le faire quelque chose avec LD_PRELOAD_PATH et surpassant le retour en cas de besoin? (approche statique pure ...) – LB40

+0

Vous ne pouvez pas vraiment surcharger le retour en C, ce n'est pas un appel de fonction. C'est juste un mot-clé qui génère l'instruction appropriée pour revenir d'un appel de sous-programme. Un compilateur particulier peut ajouter des fioritures, comme pour le moniteur de performance, mais ce n'est pas C. –

9

GCC a un attribut pour ce qui appelle une fonction lorsqu'une variable automatique est hors de portée, en lui transmettant l'adresse de cette variable

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; 
} 

Sortie:

calling f... 
in f... 
cleanup called... 
out of it... 
+0

Belle pièce de C-Fu. Ou GCC-Fu, pour être exact. – qrdl

+0

Je n'ai jamais entendu parler de GCC-Fu –

+0

Il s'agit d'une école à l'intérieur de C-Fu, et RMS est le maître :) – qrdl

Questions connexes