C언어에서 int main()을 쓰는 이유, 무엇인가?

C언어를 입문하면 아마도 대부분은 다음과 같은 코드를 가장 먼저 접할 것입니다.

#include <stdio.h>

int main()
{
    printf("Hello, world!\n");
    return 0;
}

익히 아시다시피 화면에 Hello, world!라는 문구를 출력하는 프로그램입니다.

그런데 말입니다. 코드 구조를 보면 프로그램의 시작과 함께 호출되는, 메인이 되는 함수가 정수형(int)으로 선언되어 있고, 종료시 0이라는 값을 반환하는 것을 볼 수 있습니다. 아마 이를 처음 접하는 사람들은 ‘그냥 아무 값도 반환하지 않는(void) 형으로 선언하면 간단한데 왜 굳이 정수형으로 선언하고 마지막에 0을 반환하는 것인지?’ 하는 생각을 하게 될지도 모릅니다. 그래서인지 가끔가다 int main() 대신 void main()으로 선언하고 리턴을 빼버리거나 아니면 return;으로 하는 경우도 있긴 하나, 이는 C언어 표준에 위배되므로 지양해야 하며, 오직 int main()으로 선언하는 것만이 C언어 표준에 부합합니다. 실제로 void main()으로 선언하고 컴파일하면 컴파일러에 따라 경고(Warning)를 띄우는 경우도 있습니다.
주: 코드에 결함이 있을 때 컴파일러가 보내는 메시지는 오류(Error)와 경고(Warning)가 있습니다. 오류(Error)는 실행이 불가능할 정도의 심각한 코드 결함이 발생한 것으로 컴파일 결과 오류가 발견되면 실행할 수 없고 빌드도 되지 않습니다. 경고(Warning)는 경미한 코드 결함이 발생한 것으로 오류는 없고 경고만 있다면 실행은 가능하나 프로그램 구동시 문제가 발생할 수 있으므로 해당 부분을 수정할 필요가 있습니다.

그리고 대개 끝날 때 return 0;로 써서 0을 반환하고 끝내지만, 0 대신 1을 반환하고 끝내거나(return 1;), 아니면 0도 1도 아닌 다른 숫자를 반환하고 끝낼 수도 있습니다. 하지만 그렇다고 해서 프로그래머의 마음이 내키는 대로 반환값을 아무 숫자나 설정하는 것은 아닙니다. 왜냐하면 프로그램을 종료하면서 반환하는 값은 그냥 아무 의미없는 숫자가 아닌, 엄연히 ‘종료 상태'(Exit status)라는 의미를 갖고 있는 값이기 때문입니다. C언어 표준에서 반드시 메인 함수를 int main()으로 선언해서 끝날 때 정수값을 반환하도록 정의하고 있는 이유가 바로 여기에 있습니다. 즉 종료시 종료 상태값을 반환해야 하는데 void main()으로 선언하면 종료 상태값을 반환할 수 없으므로 int main()으로 선언해서 종료 상태값을 반환할 수 있게 해야 하는 것입니다.

종료 상태값은 프로그램이 어떻게 종료되었느냐에 따라서 다르게 나오는데, 일반적으로 널리 쓰이는 윈도우즈나 리눅스 등에서는 정상적으로 종료되면 0을 반환하고 비정상적으로 종료되거나 사용자가 내린 명령을 제대로 수행하지 못하면(유효하지 않은 명령을 내리거나, 명령은 유효하나 그 대상이 잘못된 경우 등) 0이 아닌 다른 값(1 등)을 반환합니다. 앞의 Hello, world! 예제의 경우 단지 Hello, world! 문구만 출력하고 끝이라 잘못될 여지가 없어 0을 반환하는 것만 설정하고 있습니다.

C언어의 표준 라이브러리 중 stdlib.h에는 다음과 같이 종료 상태값을 상수로 정의하고 있습니다.

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

여기서는 성공적으로 종료시 0을, 종료가 성공적이지 못하면 1을 반환하게끔 정의되어 있습니다. 이 라이브러리를 포함하면 메인 함수 안에서 return EXIT_SUCCESS;를 쓰면 return 0;를 쓴 것과 동일하고, return EXIT_FAILURE;를 쓰면 return 1;을 쓴 것과 동일합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다