Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从使用atexit()注册的函数中获取退出状态_C - Fatal编程技术网

C 从使用atexit()注册的函数中获取退出状态

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,但是,嘿,它是可移植的 在一个更维护友

在我的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
,但是,嘿,它是可移植的


在一个更维护友好的注释中,您可能想考虑编写某种包装器来为您做类似的事情。破解GCC如何实现

exit()
听起来像是一场维护噩梦。最好编写一些为您退出的助手函数,如果您喜欢这种类型的函数,甚至可以用宏来屏蔽它们。如果总是使用括号调用
return
,则使用宏甚至可以替换
return
调用。尽管这听起来更像是一场维护噩梦。

您可能想在退出时使用
。这是不推荐的,这不是Posix,但至少在glibc中是这样。

谢谢。是的,在调用exit()之前设置我自己的全局函数,并在我注册的func中使用它似乎是最好的主意。记住宏中
exit
周围的括号-它们确保宏不会尝试调用自己,而是允许宏调用相同名称的函数。我最近才学会了这个技巧,但它可以让你避免用类似于
#define EXIT(x)EXIT(last_EXIT=x)
的东西让你的黑客行为变得显而易见。所有的大写字母都很难看。建议在宏定义中在
(x)
周围加一组括号。@caf-My bad。我通常这样做。值得一提的是,如果没有括号,我看不出有什么方法会适得其反-唯一优先级较低的运算符是
,这将导致一个完全不同的(而且非常容易捕获)问题。