C++ 프로그램 종료
C++에서는 다음과 같은 방법으로 프로그램을 종료할 수 있습니다.
exit
함수
stdlib.h>에 <선언된 함수는 exit
C++ 프로그램을 종료합니다. 인수 exit
로 제공된 값은 프로그램의 반환 코드 또는 종료 코드로 운영 체제에 반환됩니다. 규칙에 따라 반환 코드 0은 프로그램이 성공적으로 완료되었음을 의미합니다. 상수 EXIT_FAILURE
와 EXIT_SUCCESS
stdlib.h>에 <정의된 상수도 사용하여 프로그램의 성공 또는 실패를 나타낼 수 있습니다.
abort
함수
표준 include file <stdlib.h>에도 선언된 함수는 abort
C++ 프로그램을 종료합니다. 차이점은 exit
abort
C++ 런타임 종료 처리가 수행될 수 있다는 exit
점입니다(전역 개체 소멸자가 호출됨). abort
는 프로그램을 즉시 종료합니다. 이 함수는 abort
초기화된 전역 정적 개체에 대한 일반 소멸 프로세스를 무시합니다. 또한 이 함수는 atexit
함수를 사용하여 지정된 모든 특수 처리를 건너뜁니다.
Microsoft 관련: Windows 호환성을 위해 Microsoft 구현 abort
을 통해 특정 상황에서 DLL 종료 코드를 실행할 수 있습니다. 자세한 내용은 abort
를 참조하세요.
atexit
함수
함수를 atexit
사용하여 프로그램이 종료되기 전에 실행되는 작업을 지정합니다. 종료 처리 함수를 실행하기 전에 호출 atexit
이 제거되기 전에 초기화된 전역 정적 개체가 없습니다.
return
statement 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;
}
exit
이전 예제의 and return
문은 비슷한 동작을 갖습니다. 둘 다 프로그램을 종료하고 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" );
}
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기