2010-02-04 4 views

Odpowiedz

3

Oto Hack:

// hack.c 
int last_exit; 

// hack.h 
extern int last_exit; 
#define exit(x) (exit)(last_exit = (x)) 

nie będą działać dla return, ale hej, to przenośny!

W przypadku bardziej przyjaznej dla opiekuna uwagi warto rozważyć napisanie jakiejś formy opakowania, aby zrobić coś podobnego do tego. Hackowanie w jaki sposób GCC implementuje exit() brzmi jak koszmar utrzymania. Lepiej napisać kilka funkcji pomocniczych, które wychodzą, a może nawet zamaskować je za pomocą makr, jeśli robisz coś takiego. W przypadku makra można nawet zastąpić wywołania return, jeśli zawsze wywoływane jest return z nawiasem. Choć brzmi to jak jeszcze bardziej z koszmaru konserwacji.

+0

Dzięki. Tak ustawianie własnego globalnego przed wywołaniem exit() i używanie go w moim zarejestrowanym funku wydaje się najlepszym pomysłem. –

+0

Zapamiętaj nawiasy wokół 'exit' w makrze - upewnij się, że makro nie będzie próbowało wywoływać siebie, ale pozwól makro wywołać funkcję o tej samej nazwie. Niedawno nauczyłem się tej sztuczki, ale pozwala ci to uniknąć wyraźnego zaznaczenia twojego hacka z czymś takim jak '#define EXIT (x) exit (last_exit = x)'. Wszystkie czapki są po prostu brzydkie. –

+1

Zalecany jest dodatkowy zestaw nawiasów wokół '(x)' w definicji makra. – caf

0

Może chcesz użyć on_exit. Jest to przestarzałe i nie jest to Posix, ale przynajmniej jest w glibc.

Powiązane problemy