VSCode에서 C 또는 C++ 프로그램을 실행할 때 다음과 같은 오류가 발생할 수 있습니다:
error: '::main' must return 'int' void main()
이 문제는 주로 void main() 형태로 main 함수를 선언했을 때 발생하며, 특히 C++ 환경이나 최신 컴파일러를 사용하는 경우 자주 나타납니다. 아래 코드 예제를 살펴보겠습니다.
#include <stdio.h>
void main()
{
int a, *p, b, c, d, e;
a = 100;
p = &a;
b = *&a;
printf("a=%d\n", a);
printf("p=%d\n", p);
printf("*p=%d\n", *p);
printf("*&a=%d\n", b);
c = (*p)++;
printf("(*p)++=%d\n", c);
printf("a=%d\n", a);
}
오류 원인 분석
C 언어의 초기 표준(C89)에서는 main() 함수의 반환 형식으로 void도 허용되었습니다. 하지만 C99 및 이후 표준(C11, C17), 그리고 모든 C++ 표준에서는 main 함수의 반환 타입이 반드시 int여야만 합니다.
또한, VSCode는 일반적으로 g++ 또는 gcc 기반의 컴파일러와 함께 작동하며, 이들은 엄격한 표준 준수를 요구합니다. 따라서 void main()은 비표준이며 컴파일 에러를 유발합니다.
해결 방법
다음과 같이 main 함수의 시그니처를 수정해야 합니다:
int main(void)
{
// 변수 선언 및 로직
int value = 100;
int* ptr = &value;
int deref = *&value;
printf("value = %d\n", value);
printf("ptr = %p\n", (void*)ptr);
printf("*ptr = %d\n", *ptr);
printf("*&value = %d\n", deref);
int postIncrement = (*ptr)++;
printf("(*ptr)++ = %d\n", postIncrement);
printf("updated value = %d\n", value);
return 0; // 프로그램 정상 종료를 의미
}
또는 명령행 인수를 처리할 필요가 있다면 다음 형태를 사용할 수 있습니다:
int main(int argc, char* argv[])
왜 int main() 인가?
운영체제는 프로그램의 종료 상태를 통해 실행 결과를 판단합니다. main 함수가 int를 반환함으로써:
return 0;: 정상 종료return 1;또는 다른 양수: 오류 또는 비정상 종료
와 같이 상태 값을 전달할 수 있습니다. 이는 스크립트나 다른 프로그램에서 해당 실행 파일의 성공 여부를 체크하는 데 활용됩니다.
C99 이후 표준에서는 main 함수 내에 return 문이 명시되지 않아도 암시적으로 return 0;이 삽입되지만, 가독성과 명확성을 위해 항상 return 0;을 포함시키는 것이 바람직한 코딩 관행입니다.