C++ 정리 - 10 main 함수

5344 단어 maincppcpp

소스 코드는 main함수에서부터 실행된다.
모든 C++ 프로그램엔 main함수가 있어야 한다. main함수가 없으면 에러가 난다.
(Dynamic-link libraries와 static libraries 에는 main함수가 없다)

세부 사항

  • 내 프로그램에서 main함수를 호출할 수 없다.
  • main함수를 재귀적으로 호출할 수 없다.
  • main함수의 주소를 가져갈 수 없다.
  • 미리 정의(predefine)할 수 없다.
  • 전역 네임스페이스의 이름 main은 예약되어 있다.
  • 오버로딩, delete할 수 없으며,
    constexpr, consteval, inline, static, auto로 선언할 수 없고,
    coroutine이 될 수 없다.
  • 명시적인 초기화(explicit initializer)가 없는 static 클래스의 멤버들은 main함수가 실행되기 전 0으로 초기화된다.
  • Microsoft C++에서는 전역 객체도 main함수 전에 초기화된다.

main 함수의 형태

  • main함수의 선언은 언어에 이미 들어가 있기 때문에 선언을 하지 않는다.
  • 만약 했다면 다음과 같이 생겼을 것이다.
int main();
int main(int argc, char *argv[]);
  • main함수의 리턴값이 정해지지 않았다면, 컴파일러가 리턴값을 0으로 정한다.
  • argcargv의 타입은 언어가 정의한다. 이름은 임의로 바꿔도 괜찮다.
  • char* argv[]char** argv로 해도 괜찮다.
  • main함수의 인자로 커맨드 라인을 편하게 받을 수 있다.
  • argc : argc + 1 = argv의 인자 수.
    항상 0보다 크거나 같은 정수이다. (어디선 최소1이라함)
  • argv : null로 끝나는 string의 배열이다.
    • argv[0] : 널 포인터가 아닐 경우 프로그램을 실행한 커맨드 등의 이름을 가리키거나 ""를 가리킨다.
    • argv[1]과 그 다음 : 커맨드들이다.
    • 마지막 커맨드 라인은 argv[argc - 1]이다.
    • argv[argc]는 항상 널 포인터이다.
  • 커맨드 라인을 다루는 자세한 방법은 아래를 참고하자.
    https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=msvc-170#parsing-c-command-line-arguments
    https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01
  • main함수에서 function-try-block을 사용했다면, static 객체의 소멸자로 인한 예외(exception)은 잡히지 않는다.

마이크로소프트 한정

  • wmain을 사용하면 main함수를 wchar_t 버전으로 사용할 수 있다.
int wmain();
int wmain(int argc, wchar_t *argv[]);

main 함수에서 void 리턴하기

  • 마이크로소프트 기준으로 mainwmainvoid리턴값을 가질 수 있다.
  • main이 리턴값이 없을 때 대칭을 위해 사용할 수 있다.
  • 리턴값이 void일 경우 exit code를 리턴할 수 없기 때문에 추천하지 않는다. 이 경우 exit 함수로 exit code를 리턴해야한다.

envp 커맨드 라인 인자







출처

1) https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=msvc-170
2) https://en.cppreference.com/w/cpp/language/main_function

내용 수정

최초 작성 : 2022.04.16. 00:36

좋은 웹페이지 즐겨찾기