main 함수 및 명령줄 인수

모든 C++ 프로그램에는 함수가 main 있어야 합니다. 함수 없이 main C++ 프로그램을 컴파일하려고 하면 컴파일러에서 오류가 발생합니다. (동적 링크 라이브러리 및 static 라이브러리에는 함수가 main 없습니다.) 이 함수는 소스 코드 실행을 시작하지만 프로그램이 함수에 들어가기 main 전에 명시적 이 main 니셜라이저가 없는 모든 static 클래스 멤버는 0으로 설정됩니다. Microsoft C++에서는 전역 static 개체도 입력하기 전에 초기화됩니다 main. 다른 C++ 함수에는 main 적용되지 않는 함수에는 몇 가지 제한 사항이 적용됩니다. main 함수:

  • 오버로드할 수 없습니다(함수 오버로드 참조).
  • inline으로 선언할 수 없습니다.
  • static으로 선언할 수 없습니다.
  • 주소를 사용할 수 없습니다.
  • 프로그램에서 호출할 수 없습니다.

main 함수 시그니처

main 함수는 언어에 기본 제공되므로 선언이 없습니다. 이 경우 main에 대한 선언 구문은 다음과 같습니다.

int main();
int main(int argc, char *argv[]);

반환 값이 지정되지 main않은 경우 컴파일러는 반환 값 0을 제공합니다.

표준 명령줄 인수

인수의 편리한 명령줄 구문 분석을 허용하기 위한 main 인수입니다. argcargv의 형식은 언어에서 정의됩니다. 이름과 argcargv 전통적이지만 원하는 대로 이름을 지정할 수 있습니다.

인수 정의는 다음과 같습니다.

argc
다음에 나타나는 인수 수를 포함하는 정수입니다 argv. argc 매개 변수는 항상 1보다 크거나 같습니다.

argv
프로그램의 사용자가 입력한 명령줄 인수를 나타내는 null로 끝나는 문자열의 배열입니다. 규칙에 따라 argv[0]은 프로그램을 호출하는 데 사용하는 명령입니다. argv[1] 는 첫 번째 명령줄 인수입니다. 명령줄의 마지막 인수는 argv[argc - 1]항상 argv[argc] NULL입니다.

명령줄 처리를 표시하지 않는 방법에 대한 자세한 내용은 C++ 명령줄 처리 사용자 지정을 참조하세요.

참고 항목

규칙에 argv[0] 따라 프로그램의 파일 이름입니다. 그러나 Windows에서는 .를 사용하여 프로세스를 생성할 수 있습니다 CreateProcess. 첫 번째 인수와 두 번째 인수(lpApplicationNamelpCommandLine) argv[0] 를 모두 사용하는 경우 실행 가능한 이름이 아닐 수 있습니다. 실행 파일 이름 및 정규화된 경로를 검색하는 데 사용할 GetModuleFileName 수 있습니다.

Microsoft 관련 확장

다음 섹션에서는 Microsoft 관련 동작에 대해 설명합니다.

wmain 함수 및 _tmain 매크로

유니코드 와이드 char액터를 사용하도록 소스 코드를 디자인하는 경우 와이드char 액터 버전의 mainMicrosoft 관련 wmain 진입점을 사용할 수 있습니다. 다음은 다음의 유효 선언 구문입니다.wmain

int wmain();
int wmain(int argc, wchar_t *argv[]);

에 정의된 전처리기 매크로인 Microsoft 전용 _tmain매크로를 사용할 수도 있습니다 tchar.h. _tmainmain 정의되지 않는 한 _UNICODE 해결됩니다. _UNICODE가 정의된 경우에는 _tmainwmain으로 확인됩니다. _tmain 매크로 및 다른 매크로로 _t 시작하는 코드는 좁은 함수 집합과 와이드 char함수 집합 모두에 대해 별도의 버전을 빌드해야 하는 코드에 유용합니다. 자세한 내용은 제네릭 텍스트 매핑 사용을 참조 하세요.

void 다음에서 반환main

Microsoft 확장으로, main 함수 및 wmain 함수는 반환(반환 void 값 없음)으로 선언할 수 있습니다. 이 확장은 다른 컴파일러에서도 사용할 수 있지만 사용하지 않는 것이 좋습니다. 값을 반환하지 않는 경우 main 대칭으로 사용할 수 있습니다.

선언 main 하거나 반환하는 void경우 문을 사용하여 return 부모 프로세스 또는 운영 체제에 코드를 반환 exitwmain 할 수 없습니다. 코드로 exit 선언되거나 wmain 선언될 voidmain 코드를 반환하려면 함수를 exit 사용해야 합니다.

envp 명령줄 인수

또는 wmain 서명은 main 환경 변수에 액세스하기 위한 선택적 Microsoft 관련 확장을 허용합니다. 이 확장은 Windows 및 UNIX 시스템의 다른 컴파일러에서도 일반적입니다. 이름은 envp 기존 이름이지만 원하는 대로 환경 매개 변수의 이름을 지정할 수 있습니다. 환경 매개 변수를 포함하는 인수 목록에 대한 유효 선언은 다음과 같습니다.

int main(int argc, char* argv[], char* envp[]);
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);

envp
선택적 envp 매개 변수는 사용자 환경에서 설정된 변수를 나타내는 문자열 배열입니다. 이 배열은 NULL 항목으로 종료됩니다. ()에 대한 포인터 char 배열 또는 (char *envp[])에 대한 포인터로 선언할 charchar **envp수 있습니다. 프로그램에서 대신 main사용하는 wmain 경우 대신 데이터 형식charwchar_t 사용합니다.

전달된 mainwmain 환경 블록은 현재 환경의 "고정된" 복사본입니다. 나중에 호출하거나 호출 putenv 하여 환경을 변경하는 경우 현재 환경(반환됨 getenv 또는 _wenviron_wgetenv_environ 변수)이 변경되지만 가리키는 envp 블록은 변경되지 않습니다._wputenv 환경 처리를 표시하지 않는 방법에 대한 자세한 내용은 C++ 명령줄 처리 사용자 지정을 참조하세요. 인수 envp 는 C89 표준과 호환되지만 C++ 표준과는 호환되지 않습니다.

에 대한 예제 인수 main

다음 예제에서는 다음과 같이 , argvenvp 인수를 argcmain사용하는 방법을 보여줍니다.

// argument_definitions.cpp
// compile with: /EHsc
#include <iostream>
#include <string.h>

using namespace std;
int main( int argc, char *argv[], char *envp[] )
{
    bool numberLines = false;    // Default is no line numbers.

    // If /n is passed to the .exe, display numbered listing
    // of environment variables.
    if ( (argc == 2) && _stricmp( argv[1], "/n" ) == 0 )
         numberLines = true;

    // Walk through list of strings until a NULL is encountered.
    for ( int i = 0; envp[i] != NULL; ++i )
    {
        if ( numberLines )
            cout << i << ": "; // Prefix with numbers if /n specified
        cout << envp[i] << "\n";
    }
}

C++ 명령줄 인수 구문 분석

Microsoft C/C++ 코드에서 사용하는 명령줄 구문 분석 규칙은 Microsoft 전용입니다. 런타임 시작 코드는 운영 체제 명령줄에 지정된 인수를 해석할 때 다음 규칙을 사용합니다.

  • 인수를 공백이나 탭으로 구분합니다.

  • 첫 번째 인수(argv[0])는 특별하게 처리됩니다. 이 인수는 프로그램 이름을 나타냅니다. 유효한 경로 이름이어야 하므로 큰따옴표( " )로 묶은 파트가 허용됩니다. 큰따옴표는 argv[0] 출력에 포함되지 않습니다. 큰따옴표로 묶인 부분은 인수의 끝으로 공백 또는 탭 char동작자를 해석하지 못하게 합니다. 이 목록의 이후 규칙은 적용되지 않습니다.

  • 큰따옴표로 둘러싸인 문자열은 공백 char함수를 포함할 수 있는 단일 인수로 해석됩니다. 따옴표로 묶은 문자열은 인수에 포함될 수 있습니다. 캐리트(^)는 이스케 char이프 행위자 또는 구분 기호로 인식되지 않습니다. 따옴표 붙은 문자열 내에서 큰따옴표 쌍은 이스케이프된 단일 큰따옴표로 해석됩니다. 닫는 큰따옴표가 발견되기 전에 명령줄이 종료되면 지금까지 읽은 모든 char동작이 마지막 인수로 출력됩니다.

  • 백슬래시 다음의 큰따옴표( \" )는 리터럴 큰따옴표( " )로 해석됩니다.

  • 백슬래시는 큰따옴표 바로 앞에 있지 않으면 리터럴로 해석됩니다.

  • 짝수 개의 백슬래시 다음에 큰따옴표가 오는 경우, 백슬래시 쌍( \\ )마다 하나의 백슬래시( \ )가 argv 배열에 배치되고, 큰따옴표( " )는 문자열 구분 기호로 해석됩니다.

  • 홀수 개의 백슬래시 다음에 큰따옴표가 오는 경우, 백슬래시 쌍( \\ )마다 argv 배열에 하나의 백슬래시( \ )가 배치됩니다. 큰따옴표는 다시maining 백슬래시에 의해 이스케이프 시퀀스로 해석되어 리터럴 큰따옴표(")가 배치 argv됩니다.

명령줄 인수 구문 분석의 예

다음 프로그램은 명령줄 인수를 전달하는 방법을 보여 줍니다.

// command_line_arguments.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
int main( int argc,      // Number of strings in array argv
          char *argv[],   // Array of command-line argument strings
          char *envp[] )  // Array of environment variable strings
{
    int count;

    // Display each command-line argument.
    cout << "\nCommand-line arguments:\n";
    for( count = 0; count < argc; count++ )
         cout << "  argv[" << count << "]   "
                << argv[count] << "\n";
}

명령줄 구문 분석 결과

다음 표에서는 앞의 목록의 규칙을 보여 줌으로써 예제 입력 및 예상 출력을 보여 드립니다.

명령줄 입력 argv[1] argv[2] argv[3]
"abc" d e abc d e
a\\b d"e f"g h a\\b de fg h
a\\\"b c d a\"b c d
a\\\\"b c" d e a\\b c d e
a"b"" c d ab" c d

와일드카드 식

Microsoft 컴파일러는 필요에 따라 wild카드character, 물음표() 및 별표(?*)를 사용하여 명령줄에서 파일 이름 및 경로 인수를 지정할 수 있습니다.

명령줄 인수는 런타임 시작 코드의 내부 루틴에 의해 처리되며, 기본적으로 와일드카드를 문자열 배열의 별도 문자열 argv 로 확장하지 않습니다. 컴파일러 옵션 또는 명령줄에 파일(wsetargv.objwmain파일)을 포함하여 setargv.obj wild카드 확장을 사용하도록 설정할 수 있습니다 /linkLINK.

런타임 시작 링커 옵션에 대한 자세한 내용은 링크 옵션을 참조하세요.

C++ 명령줄 처리 사용자 지정

프로그램에서 명령줄 인수를 사용하지 않는 경우 명령줄 처리를 수행하는 루틴을 억제하여 약간의 공간을 절약할 수 있습니다. 사용을 억제하려면 /link 컴파일러 옵션이나 LINK 명령줄에 noarg.obj 파일(mainwmain 둘 다에 대해)을 포함합니다.

마찬가지로 envp 인수를 통해 환경 테이블에 액세스하지 않는 경우 내부 환경 처리 루틴 또한 억제할 수 있습니다. 사용을 억제하려면 /link 컴파일러 옵션이나 LINK 명령줄에 noenv.obj 파일(mainwmain 둘 다에 대해)을 포함합니다.

프로그램에서 C 런타임 라이브러리의 루틴 중 spawn 또는 exec 제품군을 호출할 수 있습니다. 이 경우 부모 프로세스에서 자식 프로세스로 환경을 전달하는 데 사용되므로 환경 처리 루틴을 억제하면 안 됩니다.

참고 항목

기본 개념