C程序中EXIT_FAILURE的正确使用方法是什么?

9
我正在编写一个Web应用程序,需要使用几个ansi C函数来处理数据。另一种语言(可能是Java)将调用主C函数来触发该过程。我想从主C函数返回一个值,以便Java脚本评估成功与否。我期望C使用exit()是为了这个目的。
在编程C时,有几次我遇到可以评估程序是否运行正确的情况。例如,如果我有一个变量只能等于“方程式1”,“方程式2”或“方程式3”,然后我使用一个
if(var==equation1) { 
  /*statements*/
} 
else if(var==equation2) {
  /*statements*/
} 
else if(var==equation3) {
  /*statements*/
}

如果我要检查这三种可能性,我可以添加一个 else { } 到末尾,其中的内容在正常运行的程序中不会执行,以捕获意外问题。我想在这个最后的 else { } 语句中放置一个 exit(EXIT_FAILURE)。如果我理解正确,这将导致程序终止,并返回一个非零值给调用程序以便检测。那是正确的吗?

出于同样的原因,我可以在各种函数中添加这个 exit(EXIT_FAILURE) 吗?

有关设置的机制的一些问题 - 主函数是否简单地设置为:int main(void);,假设没有输入参数的简单性?也就是说,需要整数才能返回由宏 EXIT_FAILURE 调用的整数值... 是这样的吗?

如果 main() 函数调用另一个函数,并且该函数包含一个 exit(EXIT_FAILURE) 语句,那么该其他函数需要在其原型中明确包含返回,例如 int function_one(void);,其中整数需要返回 EXIT_FAILURE 状态,或者 EXIT_FAILURE 宏在这方面是自给自足的,所以如果 function_one 想要返回一个字符,则其原型可以是 char function_one(void);,不用担心在其原型中返回任何东西给 EXIT_FAILURE


你需要哪些在Java中不可用的C函数?这样分割工作负载会让你的生活更轻松吗?或者你需要使用一些非常特定的库吗? - millimoose
1
数字计算确实是召唤C语言的一个很好的理由。通过谷歌搜索我找到了共享科学工具库,其中似乎包含了最近与Java绑定的FFTW库。绑定将允许您直接从Java调用FFTW函数,但重要的工作将在C代码中完成。 - millimoose
感谢Inerdial提供的链接。如果它出现在http://www.fftw.org/download.html下的“从其他语言调用FFTW”中,所有者将受益匪浅。那里现有的Java链接似乎已经失效了。 - ggkmath
3个回答

11
main的返回类型int实际上是调用进程看到的返回值。一般的想法是,你的main函数像其他函数一样使用return EXIT_FAILURE。在可能的情况下,你应该使用这种直接的方法。 exit函数可用于快捷方式退出任何不同于main函数的函数并返回给调用者。但是,使用exit的函数的返回值与它可能通过exit进行初步退出无关。因此,你不必更改任何函数的原型。
你的其他假设似乎是正确的,并且你使用exit终止无效调用的方式对我来说是有效的。

8

是的,你可以在程序任何地方调用exit(EXIT_FAILURE)

注意,exitatexit有关。还请参阅_Exit(很少有用)和abort


_exit()非常有用,特别是在fork()之后,因为它跳过了调用on_exit()安装的退出处理程序。 - Robert

4

可以在任何地方调用exit来终止程序。如果您觉得程序不应该继续运行,随时使用它。

此外,您可能希望设计自己的错误代码而不是使用通用的EXIT_FAILURE,这样您就可以向调用者提供比“出现问题”更多的信息,并将其与exit一起使用(请记住,您可以使用任何8位值而不仅仅是EXIT_FAILUREEXIT_SUCCESS)。例如,0可能表示成功,1可能表示输入读取失败,2可能表示输入格式错误,等等。


1
您可以使用0..255范围内的任何int退出。超出该范围的值不会被保留。 - Dietrich Epp
2
exit 的预定义宏以外的其他值被标准视为实现特定。不能保证这些值会传递给调用者,我认为。@DietrichEpp报告的情况据我所知是POSiX特有的。我不知道其他操作系统如何处理这个问题。 - Jens Gustedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接