Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352

    [c/c++]Ridefinire una funzione di libreria

    Salve,

    il mio obiettivo è di riuscire a ridefinire una funzione della libreiria del c, ad esempio la funzione exit( int ) che provoca l'uscita dal programma e che è definita in stdlib.h. Supponiamo che quando viene chiamata exit(n) io voglia eseguire una mia funzione myexit(n).

    Per fare ciò ho definito un file stdlib.h che ho messo nella cartella locale del mio programma, e in cui importo la vera stdlib.h e subito dopo ridefinisco exit con myexit:

    Codice PHP:
    #ifndef MYSTDLIB_H
    #define MYSTDLIB_H

    //Con questa istruzione includo la libreria originaria; la
    //includo riferendola col percorso completo per non confonderla
    //col mio file stdlib.h
    #include "/usr/include/stdlib.h"

    //dichiaro il prototipo della mia funzione
    void myexit(int);

    //ridefinisco exit con myexit
    #define exit myexit

    #endif // MYSTDLIB_H 
    L'implementazione della myexit è quindi messa in un file .c . Ora se nel mio programma includo <stdlib.h> e chiamo exit viene sempre eseguita la funzione standard della libreria. Come posso fare invece per far eseguire la mia?

    Analogamente vorrei ridefinire una macro, assert, definita in asssert.h.

    Grazie e ciao.

  2. #2
    Penso che venga inclusa la libreria standard perchè nelle opzioni di progetto dove viene settato il path relativo alle librerie da usare è impostato quello delle librerie standard, prova ad impostare come path quello in cui è contenuta la tua libreria e dovrebbe funzionare, il problema è che poi non ti funzionano le eventuali altre librerie.
    Puoi in alternativa provare a mettere un path assoluto, anzichè relativo, alla tua libreria modificata, ma di questo non ne sono sicuro.

    Ciao

    Max
    La luce è più veloce del suono,ecco xchè alcune persone sembrano brillanti fino a quando non parlano


  3. #3

    Re: [c/c++]Ridefinire una funzione di libreria

    Originariamente inviato da anx721
    Puoi usare la funzione int atexit(void (*func)(void))

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void my_exit1(void);
    void my_exit2(void);
    
    int main() {
    
      atexit(my_exit1); /* imposta il primo handler */
      atexit(my_exit2); /* imposta il secondo handler */
      
      printf("main is done\n");
     
      exit(0);
    }
    
    void my_exit1(void) {
      printf("first exit handler\n");
    }
    
    void my_exit2(void) {
      printf("second exit handler\n");
    }

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Non mi va bene questa soluzione perchè con atexit stabilisco solo che quando il programma esce debbano essere chiamate ccerte funzioni, ma non ho la possibilità di ridefinire la exit, nel senso che comuqnue con la exit continua ad esserci l'uscita dal proramma, mentre io vorrei prorpio impedire questo.

    Poi mi interessa anche poter ridefinire la macro assert definita in assert.h, che provoca la chiamata alla funzione abort che fa pure uscire dal programma, penso che se c'è un modo per fare cio valga per entrambi i problemi.

  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Allora se ridefinisco la macro assert del file assert.h, creando un mio file assert.h la cosa funziona se passo al compilatore l'opzione che gli dice di cercare i file header prima nella directory locale, dove quindi trova il mio assert.h. Per con la exit non funziona, ho definito il mio file stdlib.h:

    codice:
    #include "/usr/include/stdlib.h"
    
    //dichiaro il prototipo della mia funzione
    void myexit(int);
    
    //ridefinisco exit con myexit
    #define exit myexit
    Se chiamo exit nel mio programma viene chiamata la exit della libreria standard; se nel mio programma aggiungo esplicitamente

    #define exit myexit

    invece funziona. Il mio problema e che non posso modificare i file sorgenti, cosi volevo che la macro venisse definita per mezzo dell'inclusione di stdlib.h. Perche allora la macro messa nel file header non funziona???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.