有意义的函数返回值的常用方法是什么?

时间:2009-12-03 23:24:25

标签: c return-value

我知道EXIT_SUCCESS / EXIT_FAILURE通常用于main()退出,表示程序的成功。

但它是否也用于(通常或建议)正常的函数返回?我正在尝试编写一些“标准”代码,因此想知道我是否应该使用它们而不是0或-1 ..

7 个答案:

答案 0 :(得分:13)

请勿对EXIT_SUCCESSEXIT_FAILURE使用exitenum以外的其他任何内容。

然后,请定义您自己的函数类型以便返回,但这取决于您所编写的情况和确切代码。

一些常见的方法是:

  • 返回指针的函数几乎总是返回NULL(根据ANSI C为0,但NULL是一个更具描述性的名称),以防错误
  • 返回索引或位置的函数通常在出错时返回-1(因为它不能是真正的索引,而0可以,所以0不是一个好的错误返回值)
  • 在更复杂的情况下,您可能会发现使用{{1}}定义新的返回类型很有用,其中一个是您的错误,并检查它。

只要你保持一致,不要过分偏离惯例,记录一切,你应该没问题。

答案 1 :(得分:4)

您不应在EXIT_SUCCESS的调用或EXIT_FAILURE的返回值的上下文之外使用exit()main()。这些整数的值不是由标准指定的,因此如果假设它们分别为0或1,则无法编写可移植代码。

该标准确实指明exit(0)和来自return 0的{​​{1}}的行为方式与main()exit(EXIT_SUCCESS)相同,但这些值是“特殊的”因为它们将以实现定义的方式解释。也就是说,传递给系统的实际值可能不是0,并且如果实现需要,return EXIT_SUCCESS的常量值可以不为0,只要EXIT_SUCCESS来自main return 0来自main的行为方式相同。

如果您在函数中使用这些值,您的调用者将不得不直接与return EXIT_SUCCESS进行比较以确定函数是否成功,从个人来说,我觉得非常不方便。

EXIT_SUCCESS

问题变得更加明显int MyFunction1 () { /* ... */ return EXIT_SUCCESS; } int MyFunction2 () { /* ... */ return 0; } // Portable: if (MyFunction1 () == EXIT_SUCCESS) { ... } if (MyFunction2 () == 0) { ... } if (!MyFunction2 ()) { ... } // Not portable: if (MyFunction1 () == 0) { ... } if (!MyFunction1 ()) { ... } if (MyFunction2 () == EXIT_SUCCESS) { ... }

EXIT_FAILURE

答案 2 :(得分:3)

POSIX标准定义的许多函数返回0表示成功,或者返回非零错误代码表示失败。

许多POSIX函数被定义为成功返回0,失败返回-1,设置errno全局变量以指示失败。但是多线程程序中的全局errno doesn't work well

答案 3 :(得分:1)

如果您正在使用错误代码,那么使用相同的常量来获得图书馆使用的成功会使事情变得更加清晰。

答案 4 :(得分:0)

我说这没关系。

答案 5 :(得分:0)

我没有将EXIT_ *宏用于函数,因为:

  • 我的一些功能需要在失败时返回签名的错误
  • 我的一些函数需要返回读取或写入的字节数
  • 我更喜欢用类型化的回调函数指针处理错误
  • 我喜欢保持一致

现在,我们来到main():

  • POSIX表示您可以使用0到255的值退出。返回有意义的退出状态非常非常有用,而不仅仅是成功或失败。这有助于使脚本更加智能化。在这方面,只有EXIT_SUCCESS才有用。

答案 6 :(得分:0)

EXIT_SUCCESS是一个符号常量.-

您可以使用EXIT_SUCCESSEXIT_FAILURE以及0表示确定,非0表示失败。

取决于品味,你也可以做到这一点

#define WRONG 1
#define COOL  0

并返回那些.-

使用您感觉更舒服的任何内容,但始终保持您的选择。

希望这有帮助!