#define EXIT_SUCCESS 0

Я смотрел на программу, которая вычисляет среднее из 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;
}

2

Решение

Макросы EXIT_SUCCESS а также EXIT_FAILURE разверните в интегральные выражения, которые указывают на успешное или неудачное выполнение программы. Они являются частью стандарта C и могут быть найдены в stdlib.h или скорее cstdlib.

В вашем случае это расширится до 0, так return EXIT_SUCCESS является такой же как return 0, Однако макрос уже определен в стандартной библиотеке, поэтому вы должны использовать его вместо определения своей собственной. Обратите внимание, что возвращение или использование EXIT_SUCCESS в exit будет иметь такое же поведение, как при использовании 0 в тех случаях, так что вам решать, что вы хотите использовать.

5

Другие решения

Как отметили другие, EXIT_SUCCESS определяется в <cstdlib>, Предположительно, автор просто не знал об этом. Более того не гарантированно равен нулю, но целочисленное константное выражение, которое может использоваться в качестве аргумента exit функция для возврата … статуса успешного завершения … в среду хоста. «(C11 §7.22 / 3) Поэтому компилятор может жаловаться на пользовательский #define противоречит определению макроса в <cstdlib>,

На практике это всегда ноль, хотя. Даже если это не так, ноль также гарантированно означает успех.

Это вопрос стиля, но большинство предпочитают писать нет return Заявление вообще в конце main, И в C ++, и в последних выпусках C, return 0; добавляется автоматически в этом случае.

3

Да, это то же самое. #define в основном говорит компилятору переключаться, когда на них ссылаются, со своим значением.

Пример:

Код:

#define HELLO 0
#define WORLD "WORLD"
cout << HELLO;
cout << WORLD;

Затем компилятор изменит его на:

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

Определения гораздо безопаснее использовать, потому что вы можете легко изменить одно значение, изменяющее всю программу, чем изменять всю программу напрямую.

Кроме того, определения являются постоянными значениями. Также не имеет значения, является ли это целочисленным значением, плавающей точкой, строкой или даже структурной ссылкой. И, поскольку они постоянны, определения не могут быть изменены после выполнения программы (как в функциях).

1

Согласно 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 сам.

1
По вопросам рекламы [email protected]