main()은 C와 C++에서 무엇을 반환해야 합니까?
올바른 (가장 효율적인) 정의 방법은 무엇입니까?main()
C 및 C++로 기능합니다.int main()
또는void main()
- 왜?그럼 논쟁은?한다면int main()
그리고나서return 1
또는return 0
?
이 질문에는 다음과 같은 수많은 중복 항목이 있습니다.
- C의 유효한 시그니처는 무엇입니까?
main()
기능하고 있습니까? - 반환 유형:
main()
기능. - 의 차이점
void main()
그리고.int main()
? main()
의 시그니처(C++)- 의 적절한 선언은 무엇입니까?- C++의 경우 매우 좋은 답변입니다.
- 스타일
main()
C의 함수 - 반환 유형
main()
C의 메서드 int main()
대void main()
주식회사
관련:
- C++ :
int main(int argc, char **argv)
- C++ :
int main(int argc, char *argv[])
- 이
char *envp[]
에 대한 제3의 논거로서main()
휴대할 수 있습니까? - 필요한 것은,
int main()
함수는 모든 컴파일러의 값을 반환합니까? - 왜 의 타입은
main()
C 및 C++의 함수는 사용자가 정의할 수 있습니다. - 왜?
int main(){}
컴파일? - 의 법적 정의
main()
C++14로요?
반환값:main
에, 프로그램의 종료 방법을 나타냅니다.일반 종료는 0 반환 값으로 표시됩니다.main
비정상 종료는 0이 아닌 복귀로 표시되지만 0이 아닌 코드는 어떻게 해석되는지에 대한 표준은 없습니다.다른 사람들이 지적했듯이void main()
는 C++ 규격에 의해 금지되어 있으므로 사용하지 마십시오.유효한 C++main
시그니처는 다음과 같습니다.
int main()
그리고.
int main(int argc, char* argv[])
와 동등하다.
int main(int argc, char** argv)
또, C++에서는,int main()
return-statement를 사용하지 않고 둘 수 있습니다.이 시점에서 디폴트는 0이 반환됩니다.이것은 C99 프로그램에서도 마찬가지입니다.여부return 0;
생략할 것인지 아닌지는 논란의 여지가 있다.유효한 C 프로그램의 메인시그니처의 범위는 훨씬 넓습니다.
효율성은 문제가 되지 않습니다.main
기능.C++ 표준에 따라 프로그램의 시작과 종료를 표시하여 한 번만 입력 및 탈퇴할 수 있습니다.C의 경우 재진입main()
허용되지만 피해야 합니다.
접수된 답변은 C++를 대상으로 하고 있는 것 같기 때문에, C에 관한 답변을 추가하려고 생각하고 있습니다만, 이것은 몇 가지 점에서 다릅니다.ISO/IEC 9899:1989(C90)와 ISO/IEC 9899:1999(C99) 사이에도 몇 가지 변경이 있었습니다.
main()
다음 중 하나로 선언해야 합니다.
int main(void)
int main(int argc, char **argv)
또는 동등한 것.예를들면,int main(int argc, char *argv[])
두 번째 것과 동일합니다.C90에서는int
디폴트이므로 return type은 생략할 수 있지만 C99 이후에서는int
반환 유형을 생략할 수 없습니다.
구현이 허락하는 경우,main()
다른 방법으로 선언할 수 있다(예:int main(int argc, char *argv[], char *envp[])
). 단, 이로 인해 프로그램 구현이 정의되고 더 이상 엄격하게 준수되지 않습니다.
이 규격은 엄격하게 준수하는 반환에 대한 3가지 값을 정의합니다(즉, 구현 정의 동작에 의존하지 않음). 0
그리고.EXIT_SUCCESS
성공적인 종료를 위해EXIT_FAILURE
종료에 실패했을 경우.기타 값은 비표준이며 구현이 정의되어 있습니다.C90에서는main()
명시적이어야 합니다.return
정의되지 않은 동작을 방지하기 위해 마지막에 문을 사용합니다.C99 이후에서는 Return 스테이트먼트를 생략할 수 있습니다.main()
만약 그렇다면, 그리고main()
완료, 암묵적인 것이 있습니다.return 0
.
마지막으로, 통화의 표준적인 관점에서는 문제가 없습니다.main()
C 프로그램으로부터 재귀적으로.
표준 C - 호스트 환경
호스트 환경(일반 환경)의 경우 C11 표준(ISO/IEC 9899:2011)에서는 다음과 같이 기술되어 있습니다.
5.1.2.1 프로그램 부팅
프로그램 시작 시 호출되는 함수의 이름이 지정됩니다.
main
구현에서는 이 함수에 대한 프로토타입이 없음을 선언합니다.다음과 같은 반환 유형으로 정의되어야 한다.int
파라미터 없음:int main(void) { /* ... */ }
또는 2개의 파라미터(여기에서는
argc
그리고.argv
단, 임의의 이름을 사용할 수 있습니다.이는 선언된 함수의 로컬이기 때문입니다).int main(int argc, char *argv[]) { /* ... */ }
또는 동등한 것,10) 또는 다른 구현 정의 방식.
이러한 매개변수가 선언된 경우, 주 함수에 대한 매개변수는 다음과 같은 제약을 준수해야 한다.
- 가치
argc
음이 아니어야 한다.argv[argc]
null 포인터여야 합니다.- 의 가치가
argc
0보다 큽니다(어레이 멤버).argv[0]
통해.argv[argc-1]
include는 프로그램 시작 전에 호스트 환경에 의해 구현 정의 값이 주어지는 문자열에 대한 포인터를 포함해야 합니다.목적은 호스트 환경의 다른 곳에서 프로그램을 시작하기 전에 결정된 프로그램 정보를 제공하는 것입니다.호스트 환경에서 대문자와 소문자 모두로 된 문자열을 제공할 수 없는 경우, 구현에서는 문자열이 소문자로 수신되도록 해야 합니다.- 의 가치가
argc
0보다 큰 스트링입니다.argv[0]
프로그램명을 나타냅니다.argv[0][0]
호스트 환경에서 프로그램 이름을 사용할 수 없는 경우 null 문자가 됩니다.의 가치가argc
1보다 크다, 라고 하는 문자열이 지적하고 있다.argv[1]
통해.argv[argc-1]
프로그램 파라미터를 나타냅니다.- 파라미터
argc
그리고.argv
그리고 그 끈이 가리키고 있다.argv
어레이는 프로그램에 의해 수정이 가능해야 하며 프로그램 시작과 프로그램 종료 사이에 마지막 값을 유지해야 합니다.10) 그래서...
int
다음과 같이 정의된 typeef 이름으로 대체할 수 있습니다.int
또는 타입argv
라고 쓸 수 있다char **argv
기타 등등.
C99 또는 C11에서의 프로그램 종료
반환된 값main()
구현 정의 방식으로 '환경'으로 전송됩니다.
5.1.2.3 프로그램 종료
1 의 반환 타입이
main
함수는 와 호환되는 유형입니다.int
첫 번째 콜에서 로의 복귀main
이 함수는 콜하는 것과 같습니다.exit
에 의해 반환된 값으로 기능하다main
논거로서 11)기능하다}
에 의해,main
함수는 값 0을 반환합니다.반환 유형이 와 호환되지 않는 경우int
호스트 환경에 반환되는 종료 상태가 지정되지 않았습니다.11) 6.2.4에 따라 자동 저장 기간을 가진 개체의 수명은
main
전자의 경우, 심지어 후자의 경우에서는 일어나지 않았을 것으로 생각됩니다.
주의:0
'성공'으로 지정됩니다.사용할 수 있습니다.EXIT_FAILURE
그리고.EXIT_SUCCESS
부터<stdlib.h>
하지만 0과 1이 잘 확립되어 있습니다.Exit codes greater than 255--possible을 참조하십시오.
C89(Microsoft C)에서는, 다음의 경우에 발생하는 동작에 대해서는 기술되어 있지 않습니다.main()
함수가 반환되지만 반환 값을 지정하지 않으므로 정의되지 않은 동작이 발생합니다.
7.22.4.4.
exit
기능.5 마지막으로 호스트 환경으로 제어가 돌아갑니다.의 가치가
status
제로 또는EXIT_SUCCESS
상태 정상 종료의 구현 정의 형식이 반환됩니다.의 가치가status
이EXIT_FAILURE
정상적으로 종료되지 않은 상태의 구현 정의 형식이 반환됩니다.그렇지 않으면 반환되는 상태는 구현 정의 상태가 됩니다.
표준 C++ - 호스트 환경
C++11 표준(ISO/IEC 14882:2011)에서는 다음과 같이 기술되어 있습니다.
3.6.1 주요 기능 [basic.start.main]
1 프로그램에는 main이라고 하는 글로벌 기능이 포함되어 있어야 합니다.이것은 프로그램의 지정된 시작입니다.[...]
2 실장에서는 주요 기능을 미리 정의해서는 안 된다.이 기능은 과부하가 걸리지 않아야 한다.타입 int의 반환 타입을 가져야 하지만, 그 이외의 타입은 구현 정의되어 있다.모든 구현은 다음과 같은 주요 정의를 모두 허용해야 한다.
int main() { /* ... */ }
그리고.
int main(int argc, char* argv[]) { /* ... */ }
후자의 형태로
argc
프로그램이 실행되는 환경에서 프로그램으로 전달되는 인수 수입니다.한다면argc
이들 인수는 0이 아닙니다.argv[0]
통해.argv[argc-1]
Null-Terminated Multibyte String(NTMBS; 늘 종단 멀티바이트 문자열)의 초기 문자(17.5.2.1.4.2)에 대한 포인터로서argv[0]
프로그램 호출에 사용되는 이름을 나타내는 NTMBS의 첫 번째 문자에 대한 포인터여야 합니다.""
의 가치argc
음이 아니어야 한다.가치argv[argc]
0이어야 합니다. [주의:(옵션) 파라미터는 다음에 추가하는 것이 좋습니다.argv
. : 엔드 노트 ]3 기능
main
프로그램 내에서 사용할 수 없습니다.의 링크(3.5)main
구현 정의입니다.[...]5 반환문은 주로 주요 기능을 종료하고(자동 저장 기간으로 객체를 파기) 호출하는 효과가 있습니다.
std::exit
return 값을 인수로 지정합니다.return 스테이트먼트가 발생하지 않고 제어가 메인 끝에 도달하면 그 효과는 실행의 결과입니다.return 0;
C++ 표준은 명시적으로 "[주함수]는 다음과 같은 유형의 반환 유형을 가져야 한다.int
단, 그 이외의 타입은 실장 정의"입니다.옵션으로 지원하려면 C 표준과 동일한2개의 시그니처가 필요합니다.따라서 'void main()'은 C++ 표준에서는 직접 허용되지 않습니다.다만, 대체를 허가하는 비표준 실장을 정지하는 것은 할 수 있는 일이 없습니다.C++ 에서는, 유저의 콜이 금지되어 있는 것에 주의해 주세요.main
(단, C규격에는 해당되지 않습니다).
C++11 표준의 시작 및 종료는 각주(위 인용)를 제외하고 §7.22.4.4의 단락과 동일하다.EXIT_SUCCESS
그리고.EXIT_FAILURE
에 정의되어 있습니다.<cstdlib>
).
표준 C: 공통 내선번호
일반적으로 Unix 시스템은 세 번째 변종을 지원합니다.
int main(int argc, char **argv, char **envp) { ... }
세 번째 인수는 문자열에 대한 포인터의 null 종단 리스트입니다.각 인수는 이름, 등호 및 값(공백일 수 있음)을 가진 환경 변수입니다.이것을 사용하지 않는 경우에서도, 「」를 개입시켜 환경에 액세스 할 수 있습니다.extern char **environ;
'. 이 글로벌 변수는 POSIX에 있는 변수 중 고유하며 이를 선언하는 헤더가 없습니다.
이는 부록 J에 문서화된 공통 확장으로 C 표준에 의해 인정된다.
J.5.1 환경 인수
1 호스트 환경에서 메인 함수는 세 번째 인수를 받습니다.
char *envp[]
에 대한 포인터의 늘 종단 배열을 나타냅니다.char
각 문자열은 이 프로그램 실행(5.1.2.2.1)의 환경에 대한 정보를 제공하는 문자열을 가리킵니다.
Microsoft C
Microsoft VS 2010 컴파일러는 흥미롭습니다.웹 사이트에는 다음과 같은 내용이 있습니다.
main 선언 구문은 다음과 같습니다.
int main();
또는 옵션으로
int main(int argc, char *argv[], char *envp[]);
또는
main
그리고.wmain
함수는 반환으로 선언할 수 있습니다.void
(반환값 없음).선언하면main
또는wmain
return void로서 return 스테이트먼트를 사용하여 종료 코드를 부모 프로세스 또는 운영체제로 반환할 수 없습니다.종료 코드를 반환하려면main
또는wmain
로서 선언되다void
, 를 사용해야 합니다.exit
기능.
프로그램 실행 시 어떤 종료 코드가 부모 또는 OS에 반환되는지 명확하지 않습니다.void main()
는 종료합니다.MS 웹사이트도 무음입니다.
흥미롭게도 MS는 의 2인칭 버전을 규정하지 않습니다.main()
C 및 C++ 규격에 필요한 것입니다.세 번째 인수가 다음과 같은 세 가지 인수의 형식만 규정합니다.char **envp
환경 변수 목록 포인터입니다.
Microsoft 의 페이지에는, 그 외의 선택사항도 일람표시되어 있습니다.wmain()
넓은 문자열과 더 많은 문자열이 필요합니다.
이 페이지의 Microsoft Visual Studio 2005 버전이 나열되지 않음void main()
또 다른 방법으로요.Microsoft Visual Studio 2008 이후 버전에서는 가능합니다.
표준 C - 프리스탠딩 환경
앞서 설명한 바와 같이 위의 요건은 호스트 환경에 적용됩니다.자유로운 환경(호스트 환경 대신)에서 작업하는 경우 표준에서 언급할 수 있는 내용은 거의 없습니다.프리스탠딩 환경에서는 프로그램 시작 시 호출된 함수를 호출할 필요가 없습니다.main
반환 타입에는 제약이 없습니다.표준에는 다음과 같이 기술되어 있습니다.
5.1.2 실행 환경
두 가지 실행 환경이 정의되어 있습니다.프리스탠딩과 호스트입니다.어느 경우든 프로그램 부팅은 지정된 C 함수가 실행 환경에 의해 호출될 때 발생합니다.정적 저장 기간이 있는 모든 객체는 프로그램을 시작하기 전에 초기화(초기값으로 설정)해야 합니다.그 이외의 경우, 이러한 초기화의 방법 및 타이밍은 지정되어 있지 않습니다.프로그램을 종료하면 실행 환경에 대한 제어가 반환됩니다.
5.1.2.1 프리랜딩 환경
프리랜딩 환경(운영체제의 이점 없이 C 프로그램 실행이 이루어질 수 있음)에서는 프로그램 부팅 시 호출되는 함수의 이름과 유형이 구현 정의됩니다.프리스탠딩 프로그램에 이용 가능한 라이브러리 설비는 조항 4에 의해 요구되는 최소 세트를 제외하고 구현 정의된다.
프리스탠딩 환경에서 프로그램 종료의 영향은 구현에 의해 정의됩니다.
조항 4 적합성에 대한 상호 참조는 다음을 가리킨다.
5 엄격히 적합한 프로그램은 3)본 국제표준에 규정된 언어 및 라이브러리의 특징만을 사용해야 한다.지정되지 않은 동작, 정의되지 않은 동작 또는 구현 정의된 동작에 의존하는 출력을 생성해서는 안 되며, 구현 한도를 초과해서는 안 됩니다.
6 준거 실장의 2가지 형태는 호스트형 및 프리스탠딩형입니다.적합 호스트 구현은 엄격하게 적합한 프로그램을 수용해야 합니다.적합 프리스탠딩 실장은 라이브러리 조항(조항 7)에 명시된 기능의 사용이 표준 헤더의 내용으로 제한되는 엄격히 적합한 프로그램을 수용해야 한다.
<float.h>
,<iso646.h>
,<limits.h>
,<stdalign.h>
,<stdarg.h>
,<stdbool.h>
,<stddef.h>
,<stdint.h>
,그리고.<stdnoreturn.h>
준거 실장은 엄격하게 준거한 4)프로그램의 동작을 변경하지 않는 한 확장 기능(추가 라이브러리 기능 포함)을 가질 수 있습니다.7 적합프로그램은 적합실시에 5)수용가능한 프로그램이다.
3) 엄격히 준수하는 프로그램은 관련 매크로를 사용하는 적절한 조건부 포함 전처리 명령에 의해 보호될 경우 조건부 기능(6.10.8.3 참조)을 사용할 수 있다.예를 들어 다음과 같습니다.
#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */ /* ... */ fesetround(FE_UPWARD); /* ... */ #endif
4) 이는 적합성 구현이 이 국제표준에 명시적으로 예약된 식별자 외에는 어떤 식별자도 보유하지 않음을 의미한다.
5) 엄밀하게 준거한 프로그램은, 준거한 실장간에 최대한의 휴대성을 목적으로 하고 있습니다.준거 프로그램은, 준거 실장의 포터블이 아닌 기능에 의존할 수 있습니다.
실제로 함수를 정의하는 프리랜딩 환경에서 필요한 유일한 헤더는 다음과 같습니다.<stdarg.h>
(또한 매크로에 불과할 수도 있습니다).
표준 C++ - 프리랜딩 환경
C 표준이 호스트 환경과 프리랜딩 환경을 모두 인식하듯이 C++ 표준도 인식합니다.(ISO/IEC 14882:2011에서 인용).
1.4 구현 컴플라이언스 [intro.compliance]
7 구현에는 호스트형 구현과 프리스탠딩 구현의 2종류가 정의되어 있습니다.호스트 구현의 경우, 이 국제 표준은 사용 가능한 라이브러리 집합을 정의합니다.프리스탠딩 실장은 운영체제의 이점 없이 실행될 수 있는 것으로, 특정 언어 지원 라이브러리(17.6.1.3)를 포함하는 실장 정의 라이브러리 세트를 갖추고 있습니다.
8 적합한 구현은 잘 형성된 프로그램의 동작을 변경하지 않는 한 확장(추가 라이브러리 기능 포함)을 가질 수 있다.구현은 이 국제 표준에 따라 잘못된 형식의 확장을 사용하는 프로그램을 진단하기 위해 필요합니다.그러나 이렇게 하면 이러한 프로그램을 컴파일하고 실행할 수 있습니다.
9 각 구현에는 지원하지 않는 조건부로 지원되는 모든 구조를 식별하고 모든 로케일 고유의 3특성을 정의하는 문서가 포함되어야 합니다.
3) 이 문서에서는 구현 정의 동작도 정의합니다(1.9 참조).
17.6.1.3 도입의 자유화[준수]
2종류의 실장이 정의되어 있습니다.호스트와 프리스탠딩(1.4)입니다.호스트 구현의 경우, 이 국제 표준은 사용 가능한 헤더 집합을 설명합니다.
프리스탠딩 구현에는 구현 정의 헤더 세트가 있습니다.이 세트에는 적어도 표 16에 표시된 헤더가 포함되어야 한다.
제공된 헤더 버전
<cstdlib>
적어도 그 기능을 선언해야 한다.abort
,atexit
,at_quick_exit
,exit
,그리고.quick_exit
(18.5).이 표에 나열된 다른 헤더는 호스트 구현과 동일한 요건을 충족해야 합니다.표 16 - 구현의 자유화를 위한 C++ 헤더
Subclause Header(s) <ciso646> 18.2 Types <cstddef> 18.3 Implementation properties <cfloat> <limits> <climits> 18.4 Integer types <cstdint> 18.5 Start and termination <cstdlib> 18.6 Dynamic memory management <new> 18.7 Type identification <typeinfo> 18.8 Exception handling <exception> 18.9 Initializer lists <initializer_list> 18.10 Other runtime support <cstdalign> <cstdarg> <cstdbool> 20.9 Type traits <type_traits> 29 Atomics <atomic>
를 사용하는 것은 어떨까요?int main()
C로요?
C11 표준의 표준 §5.1.2.1은 바람직한 표기법을 나타낸다.int main(void)
- 단, 표준에는 다음 두 가지 예가 있습니다.int main()
: § 6.5.3.4 8 및 § 6.7.6.3 20. 여기서 중요한 것은 예시는 '표준'이 아니라 예시일 뿐이다.예시에 버그가 있는 경우, 그것들은 표준의 본문에 직접적인 영향을 주지 않습니다.즉, 이러한 지표는 예상되는 행동을 강하게 나타내므로 표준이 다음을 포함하는 경우int main()
일례로, 그것은 을 시사한다.int main()
는 권장되는 표기가 아니더라도 금지되지 않습니다.
6.5.3.4 다음 중 하나
sizeof
그리고._Alignof
연산자…
8 예 3 이 예에서는 가변 길이 배열의 크기가 계산되어 함수에서 반환됩니다.
#include <stddef.h> size_t fsize3(int n) { char b[n+3]; // variable length array return sizeof b; // execution time sizeof } int main() { size_t size; size = fsize3(10); // fsize3 returns 13 return 0; }
C 및 C++ 규격에서는 프리스탠딩과 호스트라는2종류의 실장이 정의되어 있습니다.
- C90 호스트 환경
허용된 양식:
int main (void)
int main (int argc, char *argv[])
main (void)
main (int argc, char *argv[])
/*... etc, similar forms with implicit int */
코멘트:
앞의 2개는 허용 형식으로 명시되어 있으며, 나머지 2개는 C90이 반환 유형 및 함수 파라미터에 대해 "암묵적인 int"를 허용하기 때문에 암묵적으로 허용되어 있습니다.다른 형식은 사용할 수 없습니다.
- C90 프리스탠딩 환경
메인 형식 또는 이름은 모두 사용할 수 있습니다.
- C99 호스트 환경
허용된 양식:
int main (void)
int main (int argc, char *argv[])
/* or in some other implementation-defined manner. */
코멘트:
C99는 암묵적인 int를 삭제했습니다.main()
는 무효가 되었습니다.
"또는 다른 구현 정의 방식"이라는 이상하고 모호한 문장이 도입되었습니다.이는 '파라미터'로 해석될 수 있다.int main()
다를 수 있다" 또는 "메인은 구현 정의 형식을 가질 수 있다"로 표시됩니다.
일부 컴파일러는 표준을 후자의 방식으로 해석하는 방법을 선택했습니다.분명, 그것은 애매하기 때문에, 기준 자체를 인용함으로써 그들이 준수하지 않는다고 쉽게 말할 수 없다.
하지만, 완전히 야생적인 형태의main()
아마 이 새로운 문장의 의도는 아니었을 것이다(?).C99의 근거(규범적이지 않음)는 문장이 다음에 대한 추가 매개변수를 참조한다는 것을 의미한다.int main
를 클릭합니다4.
그러나 호스트 환경 프로그램 종료 섹션은 메인이 int를 반환하지 않는 경우에 대해 논쟁을 계속합니다.이 섹션은 메인 선언 방법에 대한 규범은 아니지만 호스트된 시스템에서도 완전히 구현 정의된 방식으로 메인 선언이 이루어질 수 있음을 분명히 시사합니다.
- C99 프리스탠딩 환경
메인 형식 또는 이름은 모두 사용할 수 있습니다.
- C11 호스트 환경
허용된 양식:
int main (void)
int main (int argc, char *argv[])
/* or in some other implementation-defined manner. */
- C11 프리랜딩 환경
메인 형식 또는 이름은 모두 사용할 수 있습니다.
주의:int main()
는, 상기 버전에서는, 호스트 되고 있는 C 의 실장에 대해서 유효한 형식으로서 일절 기재되어 있지 않습니다.C에서는 C++와 달리()
그리고.(void)
다른 의미를 가지다전자는 언어에서 제거될 수 있는 사춘기 특성이다.C11의 향후 언어 방향을 참조해 주세요.
6.11.6 함수 선언자
빈 괄호(프로토타입 형식의 파라미터 타입 선언자가 아님)에 함수 선언자를 사용하는 것은 사춘기적인 기능입니다.
- C++03 호스트 환경
허용된 양식:
int main ()
int main (int argc, char *argv[])
코멘트:
첫 번째 형식의 빈 괄호에 주의하십시오.이 경우 C++와 C는 다릅니다.C++에서는 함수가 파라미터를 받지 않음을 의미하기 때문입니다.그러나 C에서는 어떤 매개 변수도 사용할 수 있다는 것을 의미합니다.
- C++03 프리랜딩 환경
기동시에 호출하는 함수의 이름은 실장 정의입니다.이름이 붙여진 경우main()
기재된 양식을 따라야 합니다.
// implementation-defined name, or
int main ()
int main (int argc, char *argv[])
- C++11 호스트 환경
허용된 양식:
int main ()
int main (int argc, char *argv[])
코멘트:
규격의 텍스트는 변경되었지만 의미는 동일합니다.
- C++11 프리랜딩 환경
기동시에 호출하는 함수의 이름은 실장 정의입니다.이름이 붙여진 경우main()
기재된 양식을 따라야 합니다.
// implementation-defined name, or
int main ()
int main (int argc, char *argv[])
레퍼런스
- ANSI X3.159-1989 2.1.2 호스트 환경"프로그램 시작"
프로그램 시작 시 호출되는 함수의 이름은 main입니다.구현에서 이 함수에 대한 프로토타입이 없음을 선언합니다.이 값은 int의 반환 유형으로 정의해야 하며 매개 변수는 없습니다.
int main(void) { /* ... */ }
또는 다음 2개의 파라미터(여기에서는 argc 및 argv로 표기되지만 선언된 함수의 로컬이기 때문에 임의의 이름을 사용할 수 있습니다)를 사용합니다.
int main(int argc, char *argv[]) { /* ... */ }
- ANSI X3.159-1989 2.1.2.1 프리랜딩 환경:
프리랜딩 환경(운영체제의 이점 없이 C 프로그램 실행이 이루어질 수 있음)에서는 프로그램 부팅 시 호출되는 함수의 이름과 유형이 구현 정의됩니다.
- ISO 9899:1999 5.1.2.2 호스트 환경 -> 5.1.2.2.1 프로그램 부팅
프로그램 시작 시 호출되는 함수의 이름은 main입니다.구현에서 이 함수에 대한 프로토타입이 없음을 선언합니다.이 값은 int의 반환 유형으로 정의해야 하며 매개 변수는 없습니다.
int main(void) { /* ... */ }
또는 다음 2개의 파라미터(여기에서는 argc 및 argv로 표기되지만 선언된 함수의 로컬이기 때문에 임의의 이름을 사용할 수 있습니다)를 사용합니다.
int main(int argc, char *argv[]) { /* ... */ }
또는 동등한 것, 9) 또는 기타 구현 정의 방식.
- 국제표준 - 프로그래밍 언어 - C, 버전 5.10.1.2 호스트 환경 --> 5.1.2.1 프로그램 부팅의 근거
main에 대한 인수 및 exit, main 및 atexit의 상호작용(제7.20.4.2항 참조)의 동작은 argv 문자열의 표현과 main에 의해 반환되는 값의 의미에 있어 불필요한 다양성을 억제하기 위해 체계화되어 있다.
주요 인수로서의 argc 및 argv 지정은 광범위한 사전 관행을 인식합니다.argv[hargc]는 리스트의 끝에 용장 체크를 제공하기 위한 늘 포인터여야 합니다.또한 일반적인 프랙티스에 기초하고 있습니다.
main은 제로 또는2개의 인수를 사용하여 이식할 수 있는 유일한 함수입니다.(다른 함수의 인수 수는 호출과 정의 간에 정확히 일치해야 합니다.)이 특별한 경우는 프로그램이 프로그램 인수 문자열에 액세스하지 않을 때 인수를 메인에서 제외하는 널리 퍼진 관행을 단순히 인식합니다.많은 실무적용에서 주요 논거를 세 개 이상 지원하는 반면, 그러한 실무관행은 이 기준서에 의해 축복받거나 금지되지 않는다.
- ISO 9899:1999 5.1.2.2 호스트 환경 --> 5.1.2.3 프로그램 종료
메인 함수의 반환 유형이 int와 호환되는 유형인 경우, 초기 호출에서 메인 함수로의 반환은 메인 함수에 의해 반환된 값을 인수로 하여 종료 함수를 호출하는 것과 같습니다.
}
메인 함수를 종료하면 값 0이 반환됩니다.반환 유형이 int와 호환되지 않으면 호스트 환경으로 반환되는 종료 상태가 지정되지 않습니다.
- ISO 9899:1999 5.1.2.1 프리랜딩 환경
프리랜딩 환경(운영체제의 이점 없이 C 프로그램 실행이 이루어질 수 있음)에서는 프로그램 부팅 시 호출되는 함수의 이름과 유형이 구현 정의됩니다.
- ISO 9899:2011 5.1.2.2 호스트 환경 -> 5.1.2.2.1 프로그램 부팅
이 섹션은 위에서 설명한 C99와 동일합니다.
- ISO 9899:1999 5.1.2.1 프리랜딩 환경
이 섹션은 위에서 설명한 C99와 동일합니다.
- ISO 14882:2003 3.6.1 주요 기능
구현은 주요 기능을 미리 정의해서는 안 된다.이 기능은 과부하가 걸리지 않아야 한다.타입 int의 반환 타입을 가져야 하지만, 그 이외의 타입은 실장 정의되어 있다.모든 구현은 다음과 같은 주요 정의를 모두 허용해야 한다.
int main() { /* ... */ }
그리고.
int main(int argc, char* argv[]) { /* ... */ }
- ISO 14882:2003 3.6.1 주요 기능
메인 함수를 정의하기 위해 프리스탠딩 환경에서 프로그램이 필요한지 여부가 구현 정의됩니다.
- ISO 14882:2011 3.6.1 주요 기능
구현은 주요 기능을 미리 정의해서는 안 된다.이 기능은 과부하가 걸리지 않아야 한다.타입 int의 반환 타입을 가져야 하지만, 그 이외의 타입은 실장 정의되어 있다.모든 구현은 다음 사항을 모두 허용해야 한다.
- ()가 int를 반환하는 함수입니다.
: int를 반환하는 함수(int, char로의 포인터)
메인 타입(8.3.5).
- ISO 14882:2011 3.6.1 주요 기능
이 섹션은 위에서 설명한 C++03과 동일합니다.
나는 그렇게 믿어요.main()
어느 쪽이든 반환해야 한다EXIT_SUCCESS
또는EXIT_FAILURE
에 정의되어 있습니다.stdlib.h
성공 시 0을 반환하고 오류 시 0이 아닌 값을 반환합니다.이것은 UNIX 및 DOS 스크립팅에서 프로그램에서 무슨 일이 일어났는지 알아보기 위해 사용하는 표준입니다.
main()
C89 및 K&R C에서 지정되지 않은 반환 유형은 기본적으로 'int'입니다.
return 1? return 0?
- 반환문을 작성하지 않은 경우
int main()
, 클로징}
는 기본적으로 0을 반환합니다.
(c++ 및 c99 이후의 경우만, c90 의 경우는 return 스테이트먼트를 쓸 필요가 있습니다.'메인이 0을 반환하지 않는 이유'를 참조하십시오.)
return 0
또는return 1
부모 프로세스에 의해 수신됩니다.셸에서 그것은 셸 변수에 들어가고, 만약 당신이 셸을 형성하여 프로그램을 실행하고 있고 그 변수를 사용하지 않는다면, 당신은 반환값에 대해 걱정할 필요가 없습니다.main()
.
$ ./a.out
$ echo $?
이렇게 하면 변수임을 알 수 있습니다.$?
이 값은 의 반환값 중 최하위 바이트를 수신합니다.main()
.
Unix 및 DOS 스크립팅에서는return 0
보통 오류에 대해 0이 아닌 값으로 반환됩니다.이것은 Unix 및 DOS 스크립팅에서 사용하는 표준으로 프로그램에서 무슨 일이 일어났는지 알아보고 전체 흐름을 제어합니다.
여기 반환 코드 사용에 대한 작은 시연입니다.
Linux 터미널에서 제공하는 다양한 도구를 사용할 경우 프로세스가 완료된 후 오류 처리를 위해 반환 코드를 사용할 수 있습니다.다음 텍스트 파일 myfile이 있다고 가정합니다.
다음 예시는 GREP의 동작을 확인하기 위한 것입니다.
grep 명령어를 실행하면 프로세스가 생성됩니다.통과하면(끊기지 않고) 0에서 255 사이의 코드가 반환됩니다.예를 들어 다음과 같습니다.
$ grep order myfile
네가 한다면.
$ echo $?
$ 0
0점을 받을 거예요. 왜요?grep가 일치를 검출하여 종료 코드0을 반환했기 때문에 이 값은 정상적으로 종료하기 위한 일반적인 값입니다.다시 한 번 확인해 보겠습니다만, 텍스트 파일내에 없는 것으로, 일치하는 것을 찾을 수 없습니다.
$ grep foo myfile
$ echo $?
$ 1
grep는 토큰 "foo"와 파일 내용을 대조하지 못했기 때문에 반환 코드는 1입니다(이것은 장애가 발생했을 때의 일반적인 경우이지만, 상기와 같이 선택할 수 있는 값은 매우 많습니다).
다음 bash 스크립트(Linux 터미널에 입력하기만 하면 됩니다)는 매우 기본이지만 오류 처리에 대한 개념을 제공합니다.
$ grep foo myfile
$ CHECK=$?
$ [ $CHECK -eq 0] && echo 'Match found'
$ [ $CHECK -ne 0] && echo 'No match was found'
$ No match was found
"foo"가 grep return 1을 만든 이후 두 번째 줄 뒤에 단말기에 아무것도 인쇄되지 않고 grep의 return code가 0인지 확인합니다.두 번째 조건부 문은 CHECK == 1로 인해 참이므로 마지막 줄에서 메시지를 에코합니다.
이 프로세스와 이 프로세스를 호출하고 있는 경우에서 알 수 있듯이 (main()의 반환값에 따라) 반환된 내용을 확인하는 것이 필요할 수 있습니다.
생략return 0
C 또는 C++ 프로그램이 종료되었을 때main
컴파일러는 0을 반환하기 위한 코드를 자동으로 생성하기 때문에 추가하지 않아도 됩니다.return 0;
말미에 분명히main
.
주의: 제가 이 제안을 할 때, 거의 항상 두 가지 의견 중 하나가 뒤따릅니다: "그건 몰랐어요." 또는 "그건 나쁜 조언이에요!"제 근거는 표준에서 명시적으로 지원되는 컴파일러 동작에 의존하는 것이 안전하고 유용하다는 것입니다.C의 경우 C99 이후 ISO/IEC 9899:1999 섹션 5.1.2.3을 참조하십시오.
[...] 첫 번째 콜에서 다음 콜로 되돌아가
main
이 함수는 콜하는 것과 같습니다.exit
에 의해 반환된 값으로 기능하다main
논거로서 기능하다}
에 의해,main
함수는 값 0을 반환합니다.
C++의 경우 1998년 첫 번째 표준 이후 ISO/IEC 14882: 1998 섹션 3.6.1을 참조하십시오.
return 스테이트먼트가 발생하지 않고 제어가 메인 끝에 도달하면 return 0을 실행하는 효과가 있습니다.
이후 두 표준의 모든 버전(C99 및 C++98)은 동일한 아이디어를 유지하고 있습니다.C++에서 자동으로 생성되는 멤버 함수에 의존하여 명시적인 글을 쓰는 사람은 거의 없습니다.return;
말미에 있는 성명void
기능.누락에 반대하는 이유는 "이상해 보인다"는 것으로 요약되는 것 같다.저처럼 C 표준 변경의 근거가 궁금하다면 이 질문을 읽어보십시오.또, 1990년대 초에는, 이것은 정의되어 있지 않은 동작(다양하게 서포트되고 있지만)이었기 때문에, 「슬롭 프랙티스」라고 간주되고 있었습니다.
또한 C++ 핵심 가이드라인에는 생략된 여러 인스턴스가 포함되어 있습니다.return 0;
의 마지막에main
명시적 반환이 기록되는 경우는 없습니다.그 문서에는 이 특정 주제에 대한 구체적인 지침이 아직 없지만, 적어도 그 관행을 암묵적으로 지지하는 것처럼 보인다.
그래서 나는 그것을 생략하는 것을 옹호한다; 다른 사람들은 동의하지 않는다(종종 격렬하게!어떤 경우에도 코드를 생략한 경우 표준에서 명시적으로 지원되는 코드임을 알 수 있으며 그 의미를 알 수 있습니다.
의 반환값main()
에, 프로그램의 종료 방법을 나타냅니다.반환값이 다음과 같은 경우zero
즉, 0이 아닌 값은 실행 중에 문제가 발생했음을 나타내지만 실행은 성공했음을 의미합니다.
C 및 C++ - int main() 또는 void main()에서 main() 함수를 정의하는 올바른(가장 효율적인) 방법은 무엇입니까? 그 이유는 무엇입니까?
"(가장 효율적인)"이라는 말은 질문을 바꾸지 않는다.자유로운 환경에 있지 않는 한 일반적으로 올바른 선언 방법이 하나 있습니다.main()
그리고 그것은 int를 반환하는 것과 같습니다.
해야 할 일
main()
C와 C++로 반환하시겠습니까?
그것은 해야 할 것이 아니다. main()
복귀하는 것, 그게 바로 main()
돌아가다. main()
물론 다른 사람이 호출하는 함수입니다.당신은 그 코드를 제어할 수 없습니다.main()
그러므로, 당신은 신고해야 합니다.main()
발신자와 일치하는 올바른 시그니처를 지정합니다.당신은 그 문제에 대해 선택의 여지가 없어요.C와 C+의 기준에 따라 정답이 완벽하게 정의되어 있기 때문에 어떤 것이 더 효율적이고 덜 효율적인지, 어떤 것이 더 나은지 또는 더 나쁜 스타일인지 등을 자문할 필요가 없습니다.그냥 따라가세요.
int main()이면 1을 반환합니까, 아니면 0을 반환합니까?
성공에는 0, 실패에는 0이 아닙니다.선택(또는 선택)할 필요가 없습니다.이것은, 준거하고 있는 인터페이스에 의해서 정의됩니다.
0을 반환하면 프로그램이 작업을 성공적으로 완료했음을 프로그래머에게 알립니다.
int를 반환하는 경우에도 일부 OS(Windows)는 반환된 값을 1바이트(0-255)로 잘라냅니다.
반환 값은 운영 체제에서 프로그램이 어떻게 닫혔는지 확인하기 위해 사용할 수 있습니다.
반환값 0은 보통 대부분의 운영체제(어차피 생각할 수 있는 것)에서 OK를 의미합니다.
프로세스를 직접 호출하여 프로그램이 정상적으로 종료되었는지 확인할 수도 있습니다.
단순한 프로그래밍 컨벤션이 아닙니다.
반환할 항목은 실행 파일을 사용하여 수행할 작업에 따라 달라집니다.예를 들어 프로그램을 명령줄 셸과 함께 사용하는 경우 성공하려면 0을 반환하고 실패하면 0을 반환해야 합니다.그러면 코드 결과에 따라 조건부 처리를 통해 셸에서 프로그램을 사용할 수 있습니다.또, 해석에 따라서 제로 이외의 값을 할당할 수도 있습니다.예를 들어, 중요한 에러에 대해서는, 프로그램의 종료 포인트에 의해서 다른 종료치를 가지는 프로그램이 종료하는 경우가 있습니다.또, 이 값은 반환된 값을 검사하는 것으로써, 무엇을 실행할지를 결정할 수 있는 발신측 셸에서 사용할 수 있습니다.이 코드가 셸에서 사용하기 위한 것이 아니라 반환된 값이 아무에게도 영향을 미치지 않는 경우 생략될 수 있습니다.저는 개인적으로 사인을 사용합니다.int main (void) { .. return 0; .. }
프로세스에서 정수를 반환하는 효율과 관련된 문제가 있는 경우 이 반환값이 문제가 될 수 있도록 프로세스를 여러 번 호출하는 것을 피해야 합니다.
이것을 실행하는 경우(프로세스를 여러 번 호출하는 경우), 각 호출에 특정 프로세스를 할당하지 않고 직접 발신자 내부 또는 DLL 파일에 로직을 삽입하는 방법을 찾아야 합니다.이 경우 여러 프로세스 할당에 의해 관련된 효율 문제가 발생합니다.
상세하게 말하면, 0을 반환하는 것이 1을 반환하는 것보다 효율이 높은지 아닌지를 알고 싶다면 컴파일러에 의존할 수 있지만, 일반적으로 같은 소스(로컬, 필드, 상수, 코드, 함수 결과 등)에서 읽힌다고 가정하면, 정확히 같은 수의 클럭 사이클이 필요합니다.
Windows 에서는, 액세스 위반에 의해서 프로그램이 크래쉬 하는 경우, 종료 코드는 다음과 같습니다.STATUS_ACCESS_VIOLATION (0xC0000005)
x86 예외에 의한 다른 종류의 크래시도 마찬가지입니다.
그래서 네가 돌아온 것 말고도 다른 것들이 있어.main
또는 로 넘어갑니다.exit
종료 코드를 표시할 수 있습니다.
C에서, C11 표준의 섹션 5.1.2.2.1(강조 광산:
다음과 같은 반환 유형으로 정의해야 하며 매개 변수를 사용하지 않아야 합니다.
int main(void) { /* ... */ }
또는 2개의 파라미터(여기에서는
argc
그리고.argv
단, 임의의 이름을 사용할 수 있습니다.이는 선언된 함수의 로컬이기 때문입니다).int main(int argc, char *argv[]) { /* ... */ }
그러나 나 같은 초심자에게는 추상적인 예를 들어 이해시킬 수 있다.
프로그램에서 메서드를 작성할 때(예:int read_file(char filename[LEN]);
그 후, 이 메서드의 발신자로서 (파일을 찾을 수 없는 등, 장해가 발생할 가능성이 있기 때문에) 모든 것이 잘 되었는지를 알 수 있습니다.메서드의 반환값을 체크함으로써 모든 것이 잘 되었는지 아닌지를 알 수 있습니다.메인메서드의 반환값은 메서드가 정상적으로 실행되었음을 사용자에게 알리고 발신자(메인메서드의 사용자 등)가 예기치 않은 장애를 처리하는 방법을 결정하도록 하는 메커니즘입니다.
이제 제가 더 복잡한 시스템에 사용되는 미세 기계용 C 프로그램을 만든다고 상상해보세요.시스템이 마이크로메커니즘을 호출하면 모든 것이 예상대로 되었는지 확인하고 잠재적인 오류를 처리하려고 합니다.C 프로그램의 주요 메서드가 void를 반환하는 경우, 호출 시스템은 서브시스템(마이크로메커니즘)의 실행에 대해 어떻게 알 수 있습니까?이것이 main()이 발신자에게 정상적인 실행(또는 실행하지 않음)을 전달하기 위해 int를 반환할 수 없는 이유입니다.
즉, 다음과 같습니다.
그 이유는 호스트 환경(OS)이 프로그램이 올바르게 완료되었는지 여부를 알아야 하기 때문입니다.반환 타입으로서 int 호환성이 있는 타입(void 등)이 없는 경우, 「호스트 환경에 반환되는 스테이터스가 지정되지 않았습니다」(대부분의 OS에서 정의되지 않은 동작).
언급URL : https://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c
'sourcecode' 카테고리의 다른 글
C/C++ 프로그램이 main()보다 먼저 크래시 할 수 있는 방법이 있습니까? (0) | 2022.07.23 |
---|---|
Nuxtjs가 비동기 데이터 내에서 Firestore 데이터를 가져옵니다. (0) | 2022.07.23 |
Linux __user 매크로의 의미는 무엇입니까? (0) | 2022.07.23 |
로드 시 포커스 텍스트 상자의 Vue.js (0) | 2022.07.23 |
VM이 정의되어 있지 않습니다(vueC가 있는 vueJ).리 (0) | 2022.07.23 |