Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В C++вы можете выйти из программы следующим образом:
Функция exit
Функция, объявленная exit
в <stdlib.h>, завершает программу C++. Значение, предоставленное в качестве аргумента exit
, возвращается операционной системе в качестве возвращаемого кода программы или кода выхода. Принято, чтобы нулевым кодом возврата обозначалось, что программа завершена успешно. Константы EXIT_FAILURE
можно использовать, а EXIT_SUCCESS
также определенные в <stdlib.h>, чтобы указать успешность или сбой программы.
Функция abort
Функция abort
, объявленная в стандартном формате, включает <stdlib.h>, завершает программу C++. Разница между exit
и abort
заключается в том, что exit
обработка завершения среды выполнения C++ выполняется (вызывается глобальные деструкторы объектов). abort
немедленно завершает программу. Функция abort
проходит обычный процесс уничтожения для инициализированных глобальных статических объектов. Также осуществляется обход всей специальной обработки, которая была задана с помощью функции atexit
.
Корпорация Майкрософт: по соображениям совместимости Windows реализация abort
microsoft может разрешить выполнение кода завершения библиотеки DLL в определенных обстоятельствах. Дополнительные сведения см. в разделе abort
.
Функция atexit
Используйте функцию atexit
, чтобы указать действия, выполняемые до завершения программы. Перед выполнением функции выхода не инициализированы глобальные статические объекты, инициализированные перед вызовом atexit
.
return
оператор in main
Инструкция return
позволяет указать возвращаемое значение из main
. Оператор return
в main
первую очередь действует как любая другая return
инструкция. Все автоматические переменные уничтожаются. main
Затем вызывает возвращаемое exit
значение в качестве параметра. Рассмотрим следующий пример:
// return_statement.cpp
#include <stdlib.h>
struct S
{
int value;
};
int main()
{
S s{ 3 };
exit( 3 );
// or
return 3;
}
return
Операторыexit
, описанные в предыдущем примере, имеют аналогичное поведение. Как завершить программу, так и вернуть значение 3 операционной системе. Разница заключается в том, что exit
не уничтожает автоматическую переменную s
, а return
оператор делает.
Как правило, C++ требует, чтобы функции, имеющие возвращаемые типы, отличные от void
возвращаемого значения. Функция является исключением. Она main
может завершиться без инструкции return
. В этом случае он возвращает значение, зависящее от реализации, в вызывающий процесс. (По умолчанию MSVC возвращает значение 0.)
Уничтожение потоков и статических объектов
При вызове exit
напрямую (или при вызове после оператора изmain
), объекты потоков, связанные с текущим потокомreturn
, уничтожаются. Затем статические объекты уничтожаются в обратном порядке их инициализации (после вызовов функций, указанных в , если таковые имеются atexit
). В следующем примере показано выполнение такого процесса инициализации и удаления.
Пример
В следующем примере статические объекты sd1
создаются и sd2
инициализированы перед записью main
. После завершения работы этой программы с помощью инструкции return
сначала sd2
уничтожается, а затем sd1
. Деструктор класса ShowData
закрывает файлы, связанные с этими статическими объектами.
// using_exit_or_return1.cpp
#include <stdio.h>
class ShowData {
public:
// Constructor opens a file.
ShowData( const char *szDev ) {
errno_t err;
err = fopen_s(&OutputDev, szDev, "w" );
}
// Destructor closes the file.
~ShowData() { fclose( OutputDev ); }
// Disp function shows a string on the output device.
void Disp( char *szData ) {
fputs( szData, OutputDev );
}
private:
FILE *OutputDev;
};
// Define a static object of type ShowData. The output device
// selected is "CON" -- the standard output device.
ShowData sd1 = "CON";
// Define another static object of type ShowData. The output
// is directed to a file called "HELLO.DAT"
ShowData sd2 = "hello.dat";
int main() {
sd1.Disp( "hello to default device\n" );
sd2.Disp( "hello to file hello.dat\n" );
}
Другим способом написания этого кода является объявление ShowData
объектов с областью блокировки, которая неявно уничтожает их при выходе из области:
int main() {
ShowData sd1( "CON" ), sd2( "hello.dat" );
sd1.Disp( "hello to default device\n" );
sd2.Disp( "hello to file hello.dat\n" );
}