return 은 c언어의 예약어이다.
리턴값은 없거나 있다면 정수형이어야 한다. C++ 표준 문서(43p)에는 정확하게 It shall have a return type of type int, but otherwise its type is implementation defined 이렇게 되어 있다. main 함수의 리턴값은 int형의 타입을 가지는 것이 좋지만 구현 방식에 따라 다른 타입을 가지는 것도 가능하다. 즉 C++ 스팩은 int를 강력히 권장하기는 하지만 강요하지는 않는다. 비주얼 C++은 int, void 모두 가능한데 과거부터 이렇게 써 왔기 때문에 호환성을 더 중요시한다는 입장이다. gcc는 표준의 권고대로 main 함수의 리턴 타입으로 int만 인정한다.
main 함수가 리턴하는 값을 탈출 코드(Exit Code)라고 하는데 프로그램이 실행을 마치고 운영체제로 복귀할 때 리턴되는 값이다. 함수가 작업 결과를 호출원으로 돌려주듯이 응용 프로그램도 작업결과를 리턴할 수 있다. main 함수가 프로그램 그 자체이므로 main 함수의 리턴값이 곧 프로그램의 리턴값이 된다.
main 함수는 int 값을 반환하는데, 이 값은 프로세스의 종료:::상태(:12)로 부모 프로세스(:12)에게 전달된다. 부모 프로세는 main 함수의 반환 값을 이용해서 프로세스의 종료 상태를 확인할 수 있다. 참고로 c언어는 종료값 EXIT_SUCCESS (: 0 ) EXIT_FAILURE(: 1 )도 정의하고 있다. (stdlib.h에 정의)
탈출 코드는 보통 사용되지 않고 무시되는데 이 프로그램을 호출한 프로그램이(보통 쉘)이 꼭 필요할 경우 탈출 코드를 사용하기도 한다. 예를 들어 도스의 배치 파일(*.bat) 내에서 응용 프로그램을 실행했을 때 이 프로그램의 실행 결과를 ERRORLEVEL이라는 환경 변수로 참조할 수 있다. 32비트 환경에서는 탈출 코드 외에도 응용 프로그램간의 통신을 위한 장치가 많이 준비되어 있어 요즘은 main의 리턴값을 잘 사용하지 않는다.
당연한 얘기겠지만 main 함수가 int형을 리턴할 때, 즉 원형을 int main()으로 했을 때는 main의 끝에 반드시 return문이 있어야 하며 그렇지 않을 경우 리턴값이 없다는 경고가 발생한다. 다른 함수들은 값을 리턴하지 않을 경우 에러로 처리되지만 main 함수만큼은 경고로 처리한다는 면에서 컴파일러가 main을 조금 특수하게 취급하는 것을 알 수 있다.
int main() { } |
int func() { } |
경고로 처리됨 | 에러로 처리됨 |
C++ 표준에는 main이 값을 리턴하지 않을 경우를 인정하고 있으므로 main은 설사 리턴 타입이 int이더라도 return문을 생략할 수 있다. 비주얼 C++ 7.0이나 gcc로 테스트해 보면 과연 그렇다는 것을 확인할 수 있을 것이다. 그러나 비주얼 C++ 6.0은 표준 이전의 컴파일러라 경고를 출력하며 그래서 이 귀찮은 경고를 보지 않기 위해 이 책의 모든 예제들은 비록 스팩의 권고와는 다르지만 void main() 형식을 사용한다. 5줄밖에 안되는 예제에 return 0;가 포함되면 예제 길이가 20% 늘어나므로 도저히 그럴 수 없는 것이다.
MSDN 에는 이런 글도 있다
Alternatively, the main and wmain functions can be declared as returning void (no return value). If you declare main or wmain as returning void, you cannot return an exit code to the parent process or operating system by using a return statement. To return an exit code when main or wmain is declared as void, you must use the exit function.
main함수의 반환자료형이 void 이면 부모프로세스나 운영체제에 return statemant값을 리턴할 수 없다.
void리턴 선언해놓고 exit code 를 리턴하고싶다면 exit function 사용필수
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C] 공백 포함 문자열 입력 받기 (scanf, gets, fgets) (0) | 2023.09.04 |
---|---|
[C] 지역 변수 2차원 배열 동적 할당 및 해제 코드 (0) | 2023.09.03 |
[C] 문자열(String) - 문자열 저장, 널문자, 문자열 배열, 문자열 크기 (0) | 2023.08.31 |
[C] 정적변수, 지역변수, 전역변수 비교 (static, local, global) (0) | 2023.08.28 |
[C++] 테스트용 map<int, 포인터배열> (0) | 2023.08.22 |