본문 바로가기
컴퓨터/C++_STL

main 의 반환값은 어디에 쓰는가

by adnoctum 2009. 12. 27.
C/C++의 경우 제일 먼저 실행되는 함수의 원형은

int main(int argc, const char* argv[])

이다. 이 말은, 즉, main 함수의 반환값은 정수형이라는 뜻인데, 컴파일러에 따라 void 로 해도 되는 것이 있지만, 표준에서는 main 의 반환값을 정수형으로 명시하고 있다. 윈도우즈에서 단일 프로그램 안에서 모든 작업을 하는 경우에 main 의 반환값의 쓸모에 대해 의문을 갖는 경우가 많아 보인다. 즉, main 을 호출하는 함수도 없는데 왜 값을 반환해야 하는가 에 대한 의문을 갖기 쉬운 이유는, 단일 프로그램 안에서 모든 일을 하는 경우만을 주로 접했기 때문에 생기는 것으로 보인다.

main 은, 그 프로그램을 호출한 다른 프로그램에게, 프로그램이 어떤 상태로 종료되었는가를 알려 주기 위해 사용한다. 예를 들면 다음과 같다.

사용자 삽입 이미지

아 래의 prepare_chip_sample.py 파일은 line number 64 에서, 위쪽의 extract_raw_from_chip_to_hprd.cpp 파일이 컴파일 된 실행 파일을 호출하고 있다. 아래의 파이썬 파일은 그 이외에도 여러 실행 파일을 호출한다. 일종의 작은 pipeline 인데, 앞쪽에서 나오는 결과에 따라 적절한 프로그램을 호출하도록 되어 있다. 위의 경우 위쪽의 cpp 파일은 상황에 따라 0, -1, 1 중의 한 값을 반환하도록 되어 있다. 일반적으로 반환값 0 은 정상적으로 종료, 그 이외의 값은 비정상 종료로 간주한다. 아마도 이것은 C/C++ 특성상

if(!return_value_of_other_main){
   // 프로그램이 정상적으로 종료된 경우의 처리

}

else{

   // 프로그램이 정상적으로 종료된 경우의 처리

}


이와 같은 코딩을 가능하게 하기 때문에 사용하는 convention 이 아닐까 한다.


이 처럼, 여러 프로그램을 엮어서 다른 프로그램을 호출해야 할 필요가 있을 때, 호출된 프로그램의 종료 상태를 확인하기 위해 main 은 반환값을 가질 필요가 있다. 요즘에는 dll 이나 ocx, 아니면 so 파일같은 라이브러리 파일을 주로 사용하기 때문에 윈도우즈의 경우 automation 을 하지 않는 경우 굳이 main 의 반환값을 쓸 일이 별로 없는 것 같기는 하지만, library 가 제공되지 않는 경우에는 다음과 같이 반환값을 사용할 필요가 있다.


if((int)ShellExecute(NULL, "open", "pdftohtml.exe", "-c -q -f 1 -l 2 1.pdf", NULL, SW_HIDE) <= 32){

위 코드는 pdf 파일을 html 파일로 변경해 주는 프로그램인 pdftohtml.exe 파일을 호출하는 부분인데, ShellExecute 반환값을 사용하고 있다. 물론 이 때는 pdftohtml.exe 의 반환값을 사용하지는 않고 있는데, 이것은 내가 좀 대충 작성한 코드이기 때문이고 만약 좀 더 잘 해야 했다면 단순히 ShellExecute의 반환값만이 아닌 pdftohtml.exe 의 반환값도 사용했을 것이고, 그 값은 pdftohtml 프로그램의 main 함수의 반환값이었을 것이다.

리눅스에서는 하나의 프로그램이 하나의 작은 일만 하는 경우가 많고, 그러한 작은 여러 프로그램들을 묶어서 특정한 일을 처리하는 경우가 많기 때문에 하나의 프로그램이 어떻게 종료되었는지를 알 필요가 있을 때가 많다. 즉, 독립적으로 사용할 수 있는 작은 프로그램들을 엮어서 하나의 프로그램(흔히 파이프라인이라 불리는)을 만들 필요가 있을 때, 각 프로그램들의 반환값을 알고 있어야 적절한 처리를 할 수 있게 되는 것이다.