#define EXIT_SUCCESS 0

时间:2014-03-23 02:14:55

标签: c++ function function-prototypes

我正在查看一个计算3个数字平均值的程序,并且遇到了

#define EXIT_SUCCESS 0 

使return EXIT_SUCCESS;无错误地工作(在include标题下)。使用#define EXIT_SUCCESS 0return EXIT_SUCCESS;的目的是什么?有没有替代方案?是return 0;吗?谢谢你的时间。

以下是我正在查看的程序的代码:

#include <iostream>
#define EXIT_SUCCESS 0
using namespace std;

int main()
{
// prototypes:

float add_and_div(float, float, float);

// variables:

float x, y, z;
float result;

cout << "Enter three floats: ";
cin >> x >> y >> z;

// continue the program here

result = add_and_div( x, y, z );
cout<< "Average is \n" << result;

return EXIT_SUCCESS;
}

// function definition:

float add_and_div(float n1, float n2, float n3)
{

// continue the program here
return ( n1 + n2 + n3 ) / 3;
}

4 个答案:

答案 0 :(得分:5)

EXIT_SUCCESSEXIT_FAILURE扩展为整数表达式,表示程序执行成功或失败。它们是C标准的一部分,可以在stdlib.hcstdlib中找到。

在您的情况下,它会扩展为0,因此return EXIT_SUCCESS return 0相同。但是,宏已经在标准库中定义,因此您应该使用该宏而不是定义自己的宏。请注意,在EXIT_SUCCESS中返回或使用exit与在这些事件中使用0具有相同的行为,因此您可以根据自己的需要使用它。

答案 1 :(得分:3)

正如其他人所说,EXIT_SUCCESS<cstdlib>中定义。据推测,作者根本就没有意识到这一点。此外,保证为零,而是一个“整数常量表达式,可用作exit函数的参数,以便...成功终止状态...到主机环境。” (C11§7.22/ 3)因此,编译器可以抱怨#define中与宏定义冲突的自定义<cstdlib>

在实践中,它总是为零。即使不是,零保证也意味着成功。

这是一种风格问题,但大多数人更喜欢在return结束时不写main语句。在C ++和C的最新版本中,在这种情况下会自动添加return 0;

答案 2 :(得分:1)

是的,它是一样的。 #define基本上告诉编译器在被引用时切换它的值。

示例:

代码:

#define HELLO 0
#define WORLD "WORLD"

cout << HELLO;
cout << WORLD;

编译器然后将其更改为:

cout << 0;
cout << "WORLD";

使用定义更加安全,因为您可以轻松更改一个更改整个程序的值,而不是直接更改整个程序。

此外,定义是常量值。它是一个整数值,浮点数,字符串甚至是结构引用也没关系。并且,由于是常量,所以在程序执行后永远不能更改定义(如在函数中)。

答案 3 :(得分:1)

根据C++11 3.6.1 Main function /5

  

main中的return语句具有离开main函数(销毁具有自动存储持续时间的任何对象)并使用返回值作为参数调用std :: exit的效果。

18.5 Start and termination /8中,它指出exit

  

如果status为_zero或EXIT_SUCCESS,_将返回状态成功终止的实现定义形式。如果status为EXIT_FAILURE,则返回状态为不成功终止的实现定义形式。否则返回的状态是实现定义的。

换句话说,返回0EXIT_SUCCESS在此处具有相同的效果,因此您最好返回文字0,每个有能力的C或C ++编码器都知道该文字表明成功终止该计划。

如果确实想要使用EXIT_SUCCESS,您应该在<cstdlib>中加入一个,而不是创建自己的17.6.4.3.1 Macro names /1。根据{{​​1}}:

,标准明确禁止
  

包含标准库标题的翻译单元不得在任何标准库标题中声明#define或#undef名称。

您要包含标准头文件iostream,这意味着您不能自己定义EXIT_SUCCESS