Executer une fonction avant un "return"

Executer une fonction avant un "return" - C - Programmation

Marsh Posté le 28-05-2004 à 11:42:11    

Je cherche une fonction équivalente à 'atexit()' mais qui serait executée à la fin de chaque fonction.
 
Qui permettrai ce genre de chose:
 

Code :
  1. void a_executer(char* s) {
  2.   printf("Fin de la fonction %s\n", s);
  3. }
  4. int ma_fonction(int i) {
  5.   printf("Début de fonction %s\n", s);
  6.   on_return(a_executer("ma_fonction" ));
  7.   if(i == 1) return 1;
  8.   if(i == 2) return 2;
  9.   if(i == 3) return 4;
  10.   if(i == 4) return 8;
  11.   return -1;
  12. }


 
Ca me permettrais de logger les début et fin de fonction facilement

Reply

Marsh Posté le 28-05-2004 à 11:42:11   

Reply

Marsh Posté le 28-05-2004 à 14:01:22    

up

Reply

Marsh Posté le 28-05-2004 à 14:18:30    

Si tu as pas peur du code non portable microsoft, http://msdn.microsoft.com/library/ [...] tement.asp
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-05-2004 à 14:23:56    

merci gilou de ta largesse mais c'est du C++ à la marde MS
 
et nul besoin de tout ça en C++, un simple objet avec un destruccteur suffit

Reply

Marsh Posté le 28-05-2004 à 14:35:46    

Je lui ai mis ca parce que il a  posté ca dans la rubrique C, et que ce genre de truc marche dans du code C avec le compilo microsoft.
Pour du C++, il y a mieux adapté, certes.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-05-2004 à 14:39:56    

ça marche dans du code C tout simplement parce que VC++ ne fait pas la différence

Reply

Marsh Posté le 28-05-2004 à 14:46:39    

Si si: selon que l'extension de ton fichier est .c ou .cpp, le compilo VC++ a pas le meme comportement. La meme technique est utilisée avec le xml/html aussi d'ailleurs: du html est pas parse de la meme maniere par IE selon que l'extension est .htm ou .xml
A+,


Message édité par gilou le 28-05-2004 à 14:48:58

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-05-2004 à 14:51:32    

Et en C++ ça se ferait comment ?

Reply

Marsh Posté le 28-05-2004 à 14:56:55    

par un destructeur (comme l'a dit Taz)

Reply

Marsh Posté le 28-05-2004 à 14:56:57    

Dans Borland C++Builder j'utiliserais le try...__finally, équivalent du try...finally de Delphi, mais dans le genre code non portable on ne fait pas mieux :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 28-05-2004 à 14:56:57   

Reply

Marsh Posté le 28-05-2004 à 15:06:30    

Voial un exemple :
 

Code :
  1. class Watcher
  2. {
  3.   public :
  4.    Watcher( const std::string& funcname ) : name(funcname)
  5.    {
  6.       std::cout << "Debut de : " << name << "\n";
  7.    }
  8.    virtual ~Watcher()
  9.    {
  10.       std::cout << "Fin de : " << name << "\n";
  11.    }
  12.    private:
  13.    std::string name;
  14. };
  15. void func1()
  16. {
  17.    Watcher w("func1" );
  18.    // do stuff here
  19. }
  20. int main(int,char**)
  21. {
  22.    Watcher w("main" );
  23.     // do stuff
  24.     func1();
  25. }


 
Voila :)

Reply

Marsh Posté le 28-05-2004 à 15:07:33    

Pas mal, c'est tout simple et je n'y avais pas songé [:figti]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 28-05-2004 à 15:08:08    

Merci, ça c'est clair ;)

Reply

Marsh Posté le 29-05-2004 à 11:45:41    

antp a écrit :

Pas mal, c'est tout simple et je n'y avais pas songé [:figti]


+1, c'est carrément pas idiot et totalement portable !

Reply

Marsh Posté le 29-05-2004 à 11:47:37    

[:blueflag]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 29-05-2004 à 18:25:28    

Tu peux même faire « Watcher w(__func__) » pour être sûr de toujours avoir le bon nom de fonction (__func__ est dans C99). Avec GCC tu peux utiliser __PRETTY_FUNCTION__, qui contient en plus la signature de la fonction.

Reply

Marsh Posté le 29-05-2004 à 19:51:08    

mais on vient de dire que ça marche pas en C :o

Reply

Marsh Posté le 29-05-2004 à 19:59:34    

Ouais, parce qu'en C je me demande ce que serait "Watcher". Il n'y a pas de classes en C, non ? :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 29-05-2004 à 20:00:41    

une déclaration de fonction, ni plus ni moins

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed