C/C++ 표준 main 함수

· by 박승재

main 함수는 C/C++ 프로그램의 시작점으로, 모든 프로그램은 하나의 시작점만 가지고 있어야 하므로 main 함수는 언제나 하나만 존재해야 한다.

만약 main 함수가 없다면 프로그램을 시작할 수 없다.

main 함수에는 프로그램의 시작 인자를 넘겨줄 수 있는데 이것을 이용하면 프로그램이 시작하면서 사용자에게 입력값을 받을 수 있다.

지금껏 우리는 int main(), int main(void), void main() 등 다양한 방법으로 main 함수를 사용 했기 때문에 어떤 방법이 표준적인 방법인지 정리해보려 한다.

정의

C

  • 매개변수가 없는 main 함수

    void로 함수의 매개변수가 없음을 명시합니다.

      int main(void) {
          return 0;
      }
    
  • 매개변수가 있는 main 함수

      int main(int argc, char* argv[]) {
          return 0;
      }
    

참고: C Main

C++

  • 매개변수가 없는 main 함수

    C의 main과 다르게 매개변수 자리에 void를 써주지 않습니다.

      int main() {
          return 0;
      }
    
  • 매개변수가 있는 main 함수

      int main(int argc, char* argv[]) {
          return 0;
      }
    

참고: C++ Main

C에서의 매개변수 void

C에서는 왜 void를 인자에 명시해줘야 할까?

그 이유는 C의 문법에 있다.

#include <stdio.h>

void fn() {
    printf("fn\n");
}

void fn_void(void) {
    printf("fn_void\n");
}

int main(void) {
    fn(1); // ok
    fn_void(1); // error
    return 0;
}

C에서 fn는 인자가 없음에도 인자와 함께 호출할 수 있다. 하지만, void로 인자가 없음을 명시한 fn_void는 인자가 들어오면 컴파일 오류를 발생시킨다.

이 때문에 C에서는 인자가 없으면, void로 인자가 없음을 명시해야 함수의 잘못된 호출을 예방할 수 있다.

반면, C++에서는 fn(1) 역시 오류를 발생시키기 때문에 void를 명시할 필요가 없다.

#include <iostream>

void fn() {
    std::cout << "fn" << std::endl;
}

void fn_void(void) {
    std::cout << "fn" << std::endl;
}

int main() {
    fn(1); // error
    fn_void(1); // error
    return 0;
}

void main

void main 역시 함수 맨 마지막에 return 0을 하지 않아도 된다는 점에서 많은 사람이 사용하는 구문 중 하나다.

하지만, 이는 일부 컴파일러가 임의로 지원하는 비표준 기능으로 컴파일러가 void mainint main으로 치환해줬기에 가능하다.

만약 컴파일러가 위 기능을 지원하지 않는다면 int main으로 정의된 함수를 찾을 수 없기에 컴파일에 문제가 발생할 수 있다.

따라서 void main 대신 int main 사용을 권장한다.