Я смотрел на программу, которая вычисляет среднее из 3 чисел и наткнулся
#define EXIT_SUCCESS 0
делать return EXIT_SUCCESS;
работать без ошибок (прямо под заголовком включения). Какова цель использования #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;
}
Макросы EXIT_SUCCESS
а также EXIT_FAILURE
разверните в интегральные выражения, которые указывают на успешное или неудачное выполнение программы. Они являются частью стандарта C и могут быть найдены в stdlib.h
или скорее cstdlib
.
В вашем случае это расширится до 0
, так return EXIT_SUCCESS
является такой же как return 0
, Однако макрос уже определен в стандартной библиотеке, поэтому вы должны использовать его вместо определения своей собственной. Обратите внимание, что возвращение или использование EXIT_SUCCESS
в exit
будет иметь такое же поведение, как при использовании 0
в тех случаях, так что вам решать, что вы хотите использовать.
Как отметили другие, EXIT_SUCCESS
определяется в <cstdlib>
, Предположительно, автор просто не знал об этом. Более того не гарантированно равен нулю, но целочисленное константное выражение, которое может использоваться в качестве аргумента exit
функция для возврата … статуса успешного завершения … в среду хоста. «(C11 §7.22 / 3) Поэтому компилятор может жаловаться на пользовательский #define
противоречит определению макроса в <cstdlib>
,
На практике это всегда ноль, хотя. Даже если это не так, ноль также гарантированно означает успех.
Это вопрос стиля, но большинство предпочитают писать нет return
Заявление вообще в конце main
, И в C ++, и в последних выпусках C, return 0;
добавляется автоматически в этом случае.
Да, это то же самое. #define в основном говорит компилятору переключаться, когда на них ссылаются, со своим значением.
Пример:
Код:
#define HELLO 0
#define WORLD "WORLD"
cout << HELLO;
cout << WORLD;
Затем компилятор изменит его на:
cout << 0;
cout << "WORLD";
Определения гораздо безопаснее использовать, потому что вы можете легко изменить одно значение, изменяющее всю программу, чем изменять всю программу напрямую.
Кроме того, определения являются постоянными значениями. Также не имеет значения, является ли это целочисленным значением, плавающей точкой, строкой или даже структурной ссылкой. И, поскольку они постоянны, определения не могут быть изменены после выполнения программы (как в функциях).
Согласно C++11 3.6.1 Main function /5
:
Оператор возврата в main приводит к выходу из функции main (уничтожению любых объектов с автоматическим хранением) и вызов std :: exit с возвращаемым значением в качестве аргумента.
В 18.5 Start and termination /8
говорится, что касается exit
:
Если статус равен _zero или EXIT_SUCCESS, _ возвращается определяемая реализацией форма успешного завершения статуса. Если статус — EXIT_FAILURE, возвращается определяемая реализацией форма неудачного завершения статуса. В противном случае возвращаемый статус определяется реализацией.
Другими словами, возвращая либо 0
или же EXIT_SUCCESS
имеет тот же эффект здесь, так что вам лучше вернуть буквальное 0
, который знает каждый компетентный кодер C или C ++, указывает на успешное завершение программы.
если ты действительно хочу использовать EXIT_SUCCESS
, вы должны быть в том числе в <cstdlib>
вместо того, чтобы создавать свой собственный. Стандарт специально запрещает в противном случае согласно 17.6.4.3.1 Macro names /1
:
Модуль перевода, который включает стандартный заголовок библиотеки, не должен содержать имена #define или #undef, объявленные в любой заголовок стандартной библиотеки.
Тот факт, что вы включаете стандартный заголовочный файл iostream
означает, что вам не разрешено определять EXIT_SUCCESS
сам.