Main function
프로그램은 호스트 환경에서 프로그램의 지정된 시작점인 main 이라는 전역 네임스페이스 함수를 포함해야 합니다. 이 함수는 다음 형식 중 하나를 가져야 합니다:
int
main() {
본문
}
|
(1) | ||||||||
int
main(
int
argc
,
char
*
argv
[]
) {
본문
}
|
(2) | ||||||||
int
main(
/* implementation-defined */
) {
본문
}
|
(3) | ||||||||
main
함수.
main
함수.
main
함수,
int
를 반환함.
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
함수는 다음과 같은 몇 가지 특별한 속성을 가집니다:
main
함수의 본문은
return
문
을 포함할 필요가 없습니다: 제어가 return 문을 만나지 않고
main
의 끝에 도달하면,
return
0
;
를 실행한 것과 같은 효과가 발생합니다.
main
함수 끝에 도달했을 때의 암시적 반환)은 먼저 함수를 정상적으로 벗어나는 것(자동 저장 기간을 가진 객체들을 파괴하고
main
함수의
사후 조건 단언문
들을 평가하며
(C++26부터)
)과 동등하며, 그 후
std::exit
를
return
의 인수와 동일한 인수로 호출하는 것과 같습니다(
std::exit
는 이후 정적 객체들을 파괴하고 프로그램을 종료합니다).
main
함수에는 몇 가지 제한 사항이 있습니다(이를 위반하면 프로그램이 잘못된 형태가 됩니다):
main
이름은 함수용으로 예약되어 있습니다 (비록 클래스, 네임스페이스, 열거형 및 비전역 네임스페이스의 모든 엔티티에 이름을 붙이는 데 사용될 수 있지만,
main
으로 명명된 엔티티는 어떤 네임스페이스에서도 C
언어 링크
로 선언될 수 없습니다).
constexpr
(since C++11)
,
consteval
(since C++20)
,
inline
, 또는
static
으로 선언될 수 없습니다.
|
4)
main
함수의 반환 타입은 추론될 수 없습니다 (
auto
main
(
)
{
...
}
은 허용되지 않습니다).
|
(since C++14) |
| (since C++20) |
참고 사항
만약
main
함수가
function
try
block
으로 정의된 경우, static 객체들의 소멸자들(암묵적인
std::exit
에 의해 파괴되는)에 의해 발생된 예외들은 이것에 의해
caught
되지 않습니다.
운영체제 명령줄에서 주어진 인자들이 argv 에 의해 참조되는 멀티바이트 문자 배열로 변환되는 방식은 구현체 정의 처리 과정을 포함할 수 있습니다:
- C++ 명령줄 인수 파싱 MSDN
- 셸 소개 POSIX
매우 흔한 구현에서 정의된 형태의 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++ 표준에 소급 적용되었습니다.
| 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
함수
|