【问题标题】:#define EXIT_SUCCESS 0#define EXIT_SUCCESS 0
【发布时间】:2014-03-23 02:14:55
【问题描述】:

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

#define EXIT_SUCCESS 0 

使return EXIT_SUCCESS; 正常工作(在包含标题下方)。使用#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;
}

【问题讨论】:

  • 这太可怕了。只需#include &lt;cstdlib&gt;
  • 这太可怕了。只是return 0; :-)
  • 这太可怕了。只是从main() 的末尾掉下来,因为return 0; 是隐含的。

标签: c++ function function-prototypes


【解决方案1】:

EXIT_SUCCESSEXIT_FAILURE 扩展为整数表达式,指示程序执行成功或不成功。它们是 C 标准的一部分,可以在 stdlib.h 或更确切地说是 cstdlib 中找到。

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

【讨论】:

  • 这个答案是正确的,但是您还应该提到,尽管EXIT_SUCCESS 不一定为零,但 C 标准要求从main(或调用exit(0))返回零与返回 EXIT_SUCCESS 相同。
  • @Zack:我的回答有点误导,因为可以看出0 不是成功的有效指标。我删除了该部分并包含了您的信息。
【解决方案2】:

正如其他人所指出的,EXIT_SUCCESS&lt;cstdlib&gt; 中定义。想必作者根本就没有意识到这一点。此外,它保证为零,而是一个“整数常量表达式,可用作exit 函数的参数以返回……成功终止状态……到主机环境。” (C11 §7.22/3)因此编译器可以抱怨自定义 #define&lt;cstdlib&gt; 中的宏定义冲突。

实际上,它总是为零。即使不是,零也保证意味着成功。

这是风格问题,但大多数人更喜欢在main 的末尾不写任何return 声明。在 C++ 和最新版本的 C 中,在这种情况下会自动添加 return 0;

【讨论】:

  • ITYM return 0; 而不是 return;
  • @MattMcNabb 糟糕,我实际上认为return; 是第三种允许的情况。查了一下;不是。
【解决方案3】:

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

例子:

代码:

#define HELLO 0
#define WORLD "WORLD"

cout << HELLO;
cout << WORLD;

然后编译器会将其更改为:

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

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

此外,定义是常量值。它是整数值、浮点数、字符串还是结构引用也没关系。而且,由于是常量,定义在程序执行后永远不能更改(就像在函数中一样)。

【讨论】:

    【解决方案4】:

    根据C++11 3.6.1 Main function /5

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

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

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

    换句话说,在这里返回0EXIT_SUCCESS 具有相同的效果,因此您最好返回文字0,每个有能力的C 或C++ 编码人员都知道这表明程序已成功终止。

    如果你真的想要使用EXIT_SUCCESS,你应该在&lt;cstdlib&gt; 中包含一个而不是创建你自己的。标准明确禁止否则,根据17.6.4.3.1 Macro names /1

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

    您包含标准头文件iostream 的事实意味着您不能自己定义EXIT_SUCCESS

    【讨论】:

    • 定义你自己的实际上会导致未定义的行为(标准库可以定义的所有宏都被认为是保留的,即使你不包括它们的头文件)。
    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2014-12-01
    • 1970-01-01
    • 2013-12-04
    • 2023-04-06
    相关资源
    最近更新 更多