PDA

Visualizza la versione completa : [c/c++]Ridefinire una funzione di libreria


anx721
17-04-2004, 03:08
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:



#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.

m@ximo
17-04-2004, 11:23
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

internet
17-04-2004, 13:49
Originariamente inviato da anx721


Puoi usare la funzione int atexit(void (*func)(void)) (http://bama.ua.edu/cgi-bin/man-cgi?atexit+3C)



#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");
}

anx721
17-04-2004, 14:14
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.

anx721
19-04-2004, 22:43
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:



#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???

Loading