Namespaces
Variants

Main function

From cppreference.net

호스트된 실행 환경에서 실행되도록 코딩된 모든 C 프로그램은 프로그램의 지정된 시작점인 main 함수의 정의(프로토타입이 아닌)를 포함합니다.

int main (void) { body } (1)
int main ( int argc , char * argv [ ] ) { body } (2)
/* another implementation-defined signature */ (C99 이후) (3)

목차

매개변수

argc - 프로그램이 실행되는 환경에서 프로그램에 전달된 인수의 개수를 나타내는 음수가 아닌 값.
argv - 배열의 첫 번째 요소를 가리키는 포인터로, 이 배열은 argc + 1 개의 포인터로 구성됩니다. 이 중 마지막 포인터는 null이며, 나머지 포인터(존재하는 경우)는 호스트 환경에서 프로그램에 전달된 인수를 나타내는 문자열을 가리킵니다. argv [ 0 ] 이 null 포인터가 아닌 경우(또는 동등하게 argc > 0인 경우), 이는 프로그램 이름을 나타내는 문자열을 가리키며, 호스트 환경에서 프로그램 이름을 사용할 수 없는 경우 이 문자열은 비어 있습니다.

이름 argc argv 는 "argument count"와 "argument vector"를 의미하며, 전통적으로 사용되지만 매개변수에 다른 이름을 선택할 수도 있으며, 그들의 타입에 대해 다르지만 동등한 선언도 가능합니다: int main ( int ac, char ** av ) 도 동등하게 유효합니다.

main 함수의 일반적인 구현 정의 형태는 int main ( int argc, char * argv [ ] , char * envp [ ] ) 입니다. 여기서는 char ** 타입의 세 번째 인자가 추가되어, 실행 환경 변수 를 가리키는 포인터 배열 을 가리킵니다.

반환값

return 문이 사용되면, 반환 값은 암시적으로 호출되는 exit() 함수의 인자로 사용됩니다(자세한 내용은 아래 참조). 값 0과 EXIT_SUCCESS 는 성공적인 종료를 나타내며, 값 EXIT_FAILURE 는 비성공적인 종료를 나타냅니다.

설명

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

main 함수의 두 매개변수 형태의 파라미터들은 실행 환경에서 임의의 멀티바이트 문자열들이 전달될 수 있도록 합니다 (이것들은 일반적으로 명령줄 인수 로 알려져 있습니다). 포인터들 argv [ 1 ] .. argv [ argc - 1 ] 는 각각의 이러한 문자열들의 첫 번째 문자들을 가리킵니다. argv [ 0 ] (null이 아닌 경우)는 프로그램 자체를 호출하는 데 사용된 이름을 나타내는 null로 종료되는 멀티바이트 문자열의 초기 문자를 가리키는 포인터입니다 (또는 호스트 환경에서 이를 지원하지 않는 경우, argv [ 0 ] [ 0 ] 가 0임이 보장됩니다).

호스트 환경이 소문자와 대문자를 모두 제공할 수 없는 경우, 명령줄 인수는 소문자로 변환됩니다.

문자열은 수정 가능하며, 수정된 내용은 프로그램 종료 시까지 유지되지만, 이러한 수정 사항은 호스트 환경으로 다시 전파되지 않습니다: 예를 들어 strtok 와 함께 사용할 수 있습니다.

argv 가 가리키는 배열의 크기는 최소 argc+1 이며, 마지막 요소인 argv[argc] 는 널 포인터임이 보장됩니다.

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

1) 이 함수에 대한 프로토타입은 프로그램에 의해 제공될 수 없습니다.
2) main 함수의 반환 타입이 호환 가능한 경우 int , main 함수의 초기 호출에서 반환(그러나 이후의 재귀적 호출에서의 반환은 제외)은 exit 함수를 실행하는 것과 동등하며, main 함수가 반환하는 값을 인수로 전달합니다(이후 atexit 로 등록된 함수들을 호출하고, 모든 스트림을 플러시하고 닫으며, tmpfile 로 생성된 파일들을 삭제한 후 실행 환경으로 제어를 반환합니다).
3)

main 함수가 값을 지정하지 않는 return 을 실행하거나, 동일하게, return 을 실행하지 않고 종료하는 } 에 도달할 경우, 호스트 환경에 반환되는 종료 상태는 정의되지 않습니다.

(C99 이전)

main 함수의 반환 타입이 호환 가능 int 가 아닌 경우(예: void main ( void ) ), 호스트 환경에 반환되는 값은 명시되지 않습니다. 반환 타입이 int 와 호환 가능하고 제어가 종료하는 } 에 도달할 경우, 환경에 반환되는 값은 return 0 ; 을 실행한 것과 동일합니다.

(C99 이후)

예제

프로그램에 입력을 어디서 찾고 결과를 어디에 쓸지 알려주는 방법을 보여줍니다. 호출 방법: ./a.out indatafile outdatafile

#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("argc = %d\n", argc);
    for (int ndx = 0; ndx != argc; ++ndx)
        printf("argv[%d] --> %s\n", ndx, argv[ndx]);
    printf("argv[argc] = %p\n", (void*)argv[argc]);
}

가능한 출력:

argc = 3
argv[0] --> ./a.out
argv[1] --> indatafile
argv[2] --> outdatafile
argv[argc] = (nil)

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 5.1.2.2.1 프로그램 시작 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 5.1.2.2.1 프로그램 시작 (p: 10-11)
  • C11 표준 (ISO/IEC 9899:2011):
  • 5.1.2.2.1 프로그램 시작 (p: 13)
  • C99 표준 (ISO/IEC 9899:1999):
  • 5.1.2.2.1 프로그램 시작 (p: 12)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 5.1.2.2 호스트 환경

참고 항목

C++ 문서 for main 함수