我正在查看一个计算3个数字平均值的程序,并且遇到了
#define EXIT_SUCCESS 0
使return EXIT_SUCCESS;
无错误地工作(在include标题下)。使用#define EXIT_SUCCESS 0
和return 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;
}
答案 0 :(得分:5)
宏EXIT_SUCCESS
和EXIT_FAILURE
扩展为整数表达式,表示程序执行成功或失败。它们是C标准的一部分,可以在stdlib.h
或cstdlib
中找到。
在您的情况下,它会扩展为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,则返回状态为不成功终止的实现定义形式。否则返回的状态是实现定义的。
换句话说,返回0
或EXIT_SUCCESS
在此处具有相同的效果,因此您最好返回文字0
,每个有能力的C或C ++编码器都知道该文字表明成功终止该计划。
如果确实想要使用EXIT_SUCCESS
,您应该在<cstdlib>
中加入一个,而不是创建自己的17.6.4.3.1 Macro names /1
。根据{{1}}:
包含标准库标题的翻译单元不得在任何标准库标题中声明#define或#undef名称。
您要包含标准头文件iostream
,这意味着您不能自己定义EXIT_SUCCESS
。