C 从使用atexit()注册的函数中获取退出状态
在我的atexit()注册函数中,我想获取退出状态(要么是exit(3)的参数,要么是main()返回的内容) 有没有便携的方法可以做到这一点?是否有任何GNU libc特定的方法来实现这一点,例如我可以参考的全球持有价值?这里有一个技巧:C 从使用atexit()注册的函数中获取退出状态,c,C,在我的atexit()注册函数中,我想获取退出状态(要么是exit(3)的参数,要么是main()返回的内容) 有没有便携的方法可以做到这一点?是否有任何GNU libc特定的方法来实现这一点,例如我可以参考的全球持有价值?这里有一个技巧: // hack.c int last_exit; // hack.h extern int last_exit; #define exit(x) (exit)(last_exit = (x)) 不适用于return,但是,嘿,它是可移植的 在一个更维护友
// hack.c
int last_exit;
// hack.h
extern int last_exit;
#define exit(x) (exit)(last_exit = (x))
不适用于return
,但是,嘿,它是可移植的
在一个更维护友好的注释中,您可能想考虑编写某种包装器来为您做类似的事情。破解GCC如何实现
exit()
听起来像是一场维护噩梦。最好编写一些为您退出的助手函数,如果您喜欢这种类型的函数,甚至可以用宏来屏蔽它们。如果总是使用括号调用return
,则使用宏甚至可以替换return
调用。尽管这听起来更像是一场维护噩梦。您可能想在退出时使用。这是不推荐的,这不是Posix,但至少在glibc中是这样。谢谢。是的,在调用exit()之前设置我自己的全局函数,并在我注册的func中使用它似乎是最好的主意。记住宏中exit
周围的括号-它们确保宏不会尝试调用自己,而是允许宏调用相同名称的函数。我最近才学会了这个技巧,但它可以让你避免用类似于#define EXIT(x)EXIT(last_EXIT=x)
的东西让你的黑客行为变得显而易见。所有的大写字母都很难看。建议在宏定义中在(x)
周围加一组括号。@caf-My bad。我通常这样做。值得一提的是,如果没有括号,我看不出有什么方法会适得其反-唯一优先级较低的运算符是,
,这将导致一个完全不同的(而且非常容易捕获)问题。