Namespaces
Variants

Main function

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

프로그램은 호스트 환경에서 프로그램의 지정된 시작점인 main 이라는 전역 네임스페이스 함수를 포함해야 합니다. 이 함수는 다음 형식 중 하나를 가져야 합니다:

int main() { 본문 } (1)
int main( int argc , char * argv [] ) { 본문 } (2)
int main( /* implementation-defined */ ) { 본문 } (3)
1) 환경에서 제공하는 인수와 독립적으로 실행되는 main 함수.
2) 환경에서 제공된 인수를 받는 main 함수.
argc argv 의 이름은 임의로 지정할 수 있으며, 매개변수 타입의 표현 방식도 마찬가지입니다: int main ( int ac, char ** av ) 도 동등하게 유효합니다.
3) 구현 정의 타입의 main 함수, int 를 반환함.
C++ 표준은 구현체 정의 main 함수가 추가(선택적) 매개변수를 argv 뒤에 배치할 것을 권장합니다.
argc - 프로그램이 실행되는 환경에서 프로그램에 전달된 인수의 개수를 나타내는 음수가 아닌 값.
argv - argc + 1 개의 포인터로 이루어진 배열의 첫 번째 요소를 가리키는 포인터. 이 중 마지막 포인터는 null이며, 나머지 포인터(존재하는 경우)는 실행 환경에서 프로그램에 전달된 인수를 나타내는 null로 종료되는 멀티바이트 문자열 을 가리킵니다. argv [ 0 ] 이 null 포인터가 아닌 경우(또는 동등하게 argc > 0 인 경우), 이는 프로그램을 호출하는 데 사용된 이름을 나타내는 문자열이나 빈 문자열을 가리킵니다.
body - main 함수의 본문.

목차

설명

main 함수는 정적 저장 기간 을 가진 비지역 객체들의 초기화 가 완료된 후 프로그램 시작 시 호출됩니다. 이는 호스팅 환경 (즉, 운영체제가 있는 환경)에서 실행되는 프로그램의 지정된 진입점입니다. 독립 실행형 프로그램(부트 로더, OS 커널 등)의 진입점은 구현에 따라 정의됩니다.

두 매개변수 형태의 main 함수의 매개변수들은 실행 환경에서 임의의 멀티바이트 문자열들을 전달할 수 있게 합니다(이들은 일반적으로 명령줄 인수 로 알려져 있습니다). 포인터들 [ argv [ 1 ] , argv [ argc - 1 ] ] 는 각각의 이러한 문자열들의 첫 번째 문자들을 가리킵니다. argv [ 0 ] (null이 아닌 경우)는 프로그램 자체를 호출하는 데 사용된 이름을 나타내는 null로 종료된 멀티바이트 문자열의 초기 문자를 가리키는 포인터입니다(또는 실행 환경에서 이를 지원하지 않는 경우 빈 문자열 "" ). 이 문자열들은 수정 가능하지만, 이러한 수정 사항들은 실행 환경으로 다시 전파되지 않습니다: 예를 들어 std::strtok 와 함께 사용될 수 있습니다. argv 가 가리키는 배열의 크기는 최소 argc + 1 이며, 마지막 요소인 argv [ argc ] 는 null 포인터임이 보장됩니다.

main 함수는 다음과 같은 몇 가지 특별한 속성을 가집니다:

1) main 함수의 본문은 return 을 포함할 필요가 없습니다: 제어가 return 문을 만나지 않고 main 의 끝에 도달하면, return 0 ; 를 실행한 것과 같은 효과가 발생합니다.
2) return 문의 실행(또는 main 함수 끝에 도달했을 때의 암시적 반환)은 먼저 함수를 정상적으로 벗어나는 것(자동 저장 기간을 가진 객체들을 파괴하고 main 함수의 사후 조건 단언문 들을 평가하며 (C++26부터) )과 동등하며, 그 후 std::exit return 의 인수와 동일한 인수로 호출하는 것과 같습니다( std::exit 는 이후 정적 객체들을 파괴하고 프로그램을 종료합니다).

main 함수에는 몇 가지 제한 사항이 있습니다(이를 위반하면 프로그램이 잘못된 형태가 됩니다):

1) 프로그램 어디에서도 이름을 지정할 수 없습니다
a) 특히, 재귀적으로 호출될 수 없습니다
b) 해당 주소를 취할 수 없음
c) 이는 typeid 표현식에서 사용할 수 없습니다 또는 decltype 지정자에서 사용할 수 없습니다 (C++11부터)
2) 이것은 미리 정의될 수 없으며 오버로드될 수 없습니다: 효과적으로 전역 네임스페이스에서 main 이름은 함수용으로 예약되어 있습니다 (비록 클래스, 네임스페이스, 열거형 및 비전역 네임스페이스의 모든 엔티티에 이름을 붙이는 데 사용될 수 있지만, main 으로 명명된 엔티티는 어떤 네임스페이스에서도 C 언어 링크 로 선언될 수 없습니다).
3) 삭제된 함수로 정의될 수 없으며 정의되거나 (since C++11) 어떤 언어 링크age로도 선언될 수 없습니다 , constexpr (since C++11) , consteval (since C++20) , inline , 또는 static 으로 선언될 수 없습니다.
4) main 함수의 반환 타입은 추론될 수 없습니다 ( auto main ( ) { ... } 은 허용되지 않습니다).
(since C++14)
5) main 함수는 코루틴 이 될 수 없습니다.
6) main 함수는 명명된 모듈 에 부착될 수 없습니다.
(since C++20)

참고 사항

만약 main 함수가 function try block 으로 정의된 경우, static 객체들의 소멸자들(암묵적인 std::exit 에 의해 파괴되는)에 의해 발생된 예외들은 이것에 의해 caught 되지 않습니다.

운영체제 명령줄에서 주어진 인자들이 argv 에 의해 참조되는 멀티바이트 문자 배열로 변환되는 방식은 구현체 정의 처리 과정을 포함할 수 있습니다:

매우 흔한 구현에서 정의된 형태의 main ( ) 는 세 번째 인자( argc argv 에 추가하여)를 가지며, 이는 char ** 타입으로, 실행 환경 변수들을 가리키는 포인터들의 배열 을 가리킵니다.

예제

프로그램에 입력을 어디서 찾고 결과를 어디에 쓸 것인지 알리는 방법을 보여줍니다.
가능한 호출 예시: . / convert table_in. dat table_out. dat

#include <cstdlib>
#include <iomanip>
#include <iostream>
int main(int argc, char *argv[])
{
    std::cout << "argc == " << argc << '\n';
    for (int ndx{}; ndx != argc; ++ndx)
        std::cout << "argv[" << ndx << "] == " << std::quoted(argv[ndx]) << '\n';
    std::cout << "argv[" << argc << "] == "
              << static_cast<void*>(argv[argc]) << '\n';
    /* ... */
    return argc == 3 ? EXIT_SUCCESS : EXIT_FAILURE; // optional return value
}

가능한 출력:

argc == 3
argv[0] == "./convert"
argv[1] == "table_in.dat"
argv[2] == "table_out.dat"
argv[3] == 0

참조문헌

확장 콘텐츠
  • C++23 표준 (ISO/IEC 14882:2024):
  • 6.9.3.1 main 함수 [basic.start.main]

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 1003 C++98 main 함수의 매개변수 이름 지원이
지나치게 제한적이었음
모든 유효한 매개변수
이름이 지원됨
CWG 1886 C++98 main 함수를 언어 링크로
선언할 수 있었음
금지됨
CWG 2479 C++20 main 함수를 consteval 로 선언할 수 있었음 금지됨
CWG 2811 C++98 N3214 이후 main 함수 사용 여부가
불분명했음
이름이 지정된 경우 사용된 것으로 간주

참고 항목

C 문서 for main 함수