main
C ++ 에서 함수 의 올바른 서명은 무엇입니까 ? 올바른 반환 유형은 무엇이며 값을 반환한다는 것은 무엇을 의미 main
합니까? 허용되는 매개 변수 유형은 무엇이며 의미는 무엇입니까?
이 시스템에만 해당됩니까? 시간이 지남에 따라 이러한 규칙이 변경 되었습니까? 위반하면 어떻게 되나요?
답변
main
기능은 글로벌 네임 스페이스에 비 멤버 함수로 선언해야합니다. 이것은 클래스의 정적 또는 비 정적 멤버 함수가 될 수 없으며 네임 스페이스 (이름이없는 네임 스페이스)에도 배치 할 수 없음을 의미합니다.
이름 main
은 전역 네임 스페이스의 함수를 제외하고 C ++에서 예약되지 않았습니다. main
전역 네임 스페이스에없는 클래스, 변수, 열거 형, 멤버 함수 및 비 멤버 함수를 포함하여 이름이 지정된 다른 엔티티를 자유롭게 선언 할 수 있습니다 .
main
멤버 함수 또는 네임 스페이스로 명명 된 함수를 선언 할 수 있지만 이러한 함수는 main
프로그램이 시작되는 위치를 지정 하는 함수가 아닙니다 .
main
함수는 다음과 같이 선언 할 수 없습니다 static
나 inline
. 또한 오버로드 될 수 없습니다. main
전역 네임 스페이스에 이름이 지정된 함수는 하나만있을 수 있습니다 .
main
당신이 전화를 할 수 없습니다 : 기능은 프로그램에서 사용할 수없는 main
코드에서 어디에서나 기능을 없으며 해당 주소를 취할 수 있습니다.
의 반환 유형은 main
이어야합니다int
. 다른 반환 유형은 허용되지 않는다 (잘못된 프로그램을보고 매우 일반적이기 때문에이 규칙은 굵게 표시되어 그 선언 main
의 반환 유형 void
, 이것은 아마도 관한 가장 많이 위반 한 규칙입니다 main
기능).
두 가지 선언 main
이 허용되어야합니다.
int main() // (1)
int main(int, char*[]) // (2)
에서 (1) , 매개 변수가 없습니다.
에서는 2 개의 파라미터가 존재하고, 종래 명명 argc
하고 argv
각각. argv
프로그램에 대한 인수를 나타내는 C 문자열 배열에 대한 포인터입니다. 배열 argc
의 인수 수입니다 argv
.
일반적으로 argv[0]
프로그램 이름이 포함되어 있지만 항상 그런 것은 아닙니다. argv[argc]
널 포인터가 보장됩니다.
배열 유형 인수 (예 char*[]
:)는 실제로는 변장 포인터 유형 인수이므로 다음 두 가지 모두 쓸 수있는 유효한 방법 (2) 이며 둘 다 정확히 같은 것을 의미합니다.
int main(int argc, char* argv[])
int main(int argc, char** argv)
일부 구현은 다른 유형과 개수의 매개 변수를 허용 할 수 있습니다. 지원 문서를 확인하려면 구현 설명서를 확인해야합니다.
main()
성공을 나타내려면 0을, 실패를 나타내려면 0이 아닌 것으로 반환됩니다. 명시 적으로 return
문장을 작성할 필요는 없습니다 main()
: main()
명시적인 return
문장 없이 리턴 하면 , 마치 작성한 것과 같습니다 return 0;
. 다음 두 main()
기능은 동일한 동작을 갖습니다.
int main() { }
int main() { return 0; }
두 매크로가 있습니다 EXIT_SUCCESS
및 EXIT_FAILURE
정의, <cstdlib>
그도에서 반환 할 수 있습니다 main()
각각 성공과 실패를 나타 내기 위해이.
로 반환 된 값 main()
은 exit()
함수 로 전달되어 프로그램을 종료합니다.
이 모든 것은 호스팅 된 환경 (비공식적으로 전체 표준 라이브러리가 있고 프로그램을 실행하는 OS가있는 환경)을 위해 컴파일 할 때만 적용됩니다. 독립형 환경 (예 : 일부 유형의 임베디드 시스템)을 위해 C ++ 프로그램을 컴파일 할 수도 있습니다.이 경우 시작 및 종료가 전체적으로 정의되어 있으며 main()
기능이 필요하지 않을 수도 있습니다. 최신 데스크톱 OS를 위해 C ++를 작성하는 경우 호스팅 환경을 위해 컴파일하는 것입니다.
답변
표준 문서, 3.6.1.2 주요 기능 ,
int 유형의 리턴 유형을 가져야하지만 그렇지 않으면 유형이 구현 정의됩니다. 모든 구현은 다음 main 정의를 모두 허용해야합니다.
int main() { / ... / }
과
int main(int argc, char* argv[]) { / ... / }
후자의 형식 은 프로그램 이 실행되는 환경에서 프로그램에 전달 된 인수
argc
의 수입니다. argc가 0 이 아닌 경우이 인수는 argv [0]에서 argv [argc-1]로 초기에 대한 포인터로 제공됩니다. 널 종료 멀티 바이트 문자열의 문자 …..
도움이 되길 바랍니다 ..
답변
최신 출판 표준 (C ++ 14)의 정확한 표현은 다음과 같습니다.
구현은 두 가지를 모두 허용해야한다
함수의
()
복귀int
및의 함수
(int
에 대한 포인터에 대한 포인터를char)
반환int
유형으로
main
.
따라서 type의 main
유형이 int()
또는 이면 대체 철자가 허용됩니다 int(int, char**)
. 따라서 다음도 허용됩니다.
int main(void)
auto main() -> int
int main ( )
signed int main()
typedef char **a; typedef int b, e; e main(b d, a c)
답변
두 개의 유효한 주 전원은 int main()
및 int main(int, char*[])
입니다. 다른 것은 컴파일되거나 컴파일되지 않을 수 있습니다. 경우 main
명시 적으로 값을 반환하지 않습니다, 0은 암시 적으로 반환됩니다.
답변
반환 값 및 의미에 대한 세부 사항
3.6.1 ( [basic.start.main]
) 당 :
return 문
main
은main
함수 를 떠나고 (자동 저장 시간이있는 객체를 파괴 함)std::exit
반환 값을 인수로 호출 하는 효과가 있습니다. 명령문이main
발생하지 않고 제어가 끝에 도달하면return
그 결과는 실행 효과입니다.return 0;
동작은 std::exit
섹션 18.5 ( [support.start.term]
)에 자세히 설명되어 있으며 상태 코드를 설명합니다.
마지막으로 제어는 호스트 환경으로 돌아갑니다. status가 0 또는
EXIT_SUCCESS
이면 구현 성공 상태의 구현 정의 양식이 리턴됩니다. status가EXIT_FAILURE
인 경우 구현 실패 상태의 구현 정의 양식이 리턴됩니다. 그렇지 않으면 반환 된 상태는 구현 정의입니다.