C/C++ 표준 main 함수
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 main
을 int main
으로 치환해줬기에 가능하다.
만약 컴파일러가 위 기능을 지원하지 않는다면 int main
으로 정의된 함수를 찾을 수 없기에 컴파일에 문제가 발생할 수 있다.
따라서 void main
대신 int main
사용을 권장한다.