도움이 되었습니까?

해결책

반환 값 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() 반환 진술없이 남겨질 수 있으며,이 시점에서 기본값은 0으로 돌아갑니다. 이것은 C99 프로그램에서도 마찬가지입니다. 이든 return 0; 생략 여부는 토론에 열려 있어야합니다. 유효한 C 프로그램 메인 서명의 범위가 훨씬 큽니다.

또한 효율성은 문제가 아닙니다 main 기능. C ++ 표준에 따라 한 번만 입력 및 왼쪽으로 만 입력 할 수 있습니다 (프로그램의 시작 및 종료 표시). C의 경우 사례가 다르고 다시 들어갑니다 main() 허용되지만 피해야합니다.

다른 팁

허용 된 답변은 C ++를 대상으로하는 것으로 보이므로 C와 관련된 답변을 추가 할 것이라고 생각했으며, 이는 몇 가지 방법으로 다릅니다.

ISO/IEC 9899 : 1989 (C90) :

main() 다음 중 하나로 선언해야합니다.

int main(void)
int main(int argc, char **argv)

또는 동등한. 예를 들어, int main(int argc, char *argv[]) 두 번째와 같습니다. 또한, int 반환 유형은 기본값이므로 생략 할 수 있습니다.

구현이 허용되면 main() 다른 방식으로 선언 될 수 있지만 이로 인해 프로그램 구현이 정의되고 더 이상 엄격하게 일치하지 않습니다.

표준은 엄격하게 준수하는 반환에 대한 3 가지 값을 정의합니다 (즉, 구현 정의 된 동작에 의존하지 않습니다). 0 그리고 EXIT_SUCCESS 성공적인 종료를 위해 EXIT_FAILURE 실패한 종료. 다른 값은 비표준이며 구현이 정의됩니다. main() 명시 적이어야합니다 return 정의되지 않은 행동을 피하기 위해 결국 진술.

마지막으로, 표준 관점에서는 아무런 문제가 없습니다. main() 프로그램에서.

ISO/IEC 9899 : 1999 (C99) :

C99의 경우 모든 것이 위와 동일합니다.

  • 그만큼 int 반환 유형은 생략되지 않을 수 있습니다.
  • Return 문을 생략 할 수 있습니다 main(). 당신이 그렇게한다면, 그리고 main() 완성 된 것은 암시 적입니다 return 0.

표준 C - 호스팅 된 환경

호스팅 된 환경 (일반 환경)의 경우 C11 표준 (ISO/IEC 9899 : 2011)은 다음과 같이 말합니다.

5.1.2.2.1 프로그램 시작

프로그램 스타트 업에서 호출 된 함수의 이름이 지정됩니다 main. 구현은이 기능에 대한 프로토 타입을 선언하지 않습니다. 반환 유형으로 정의해야합니다 int 그리고 매개 변수가 없음 :

int main(void) { /* ... */ }

또는 두 개의 매개 변수가 있습니다 (여기서 참조 argc 그리고 argv, 이름은 사용될 수 있지만 선언 된 기능에 국한적이므로) : :

int main(int argc, char *argv[]) { /* ... */ }

또는 동등한;10) 또는 다른 구현 정의 방식으로.

그들이 선언 된 경우, 주 함수의 매개 변수는 다음과 같은 제약을 준수해야합니다.

  • 의 가치 argc 무분별하지는 않습니다.
  • argv[argc] 널 포인터 여야합니다.
  • 값의 경우 argc 배열 멤버는 0보다 큽니다 argv[0] ~을 통해 argv[argc-1] 포함은 문자열에 대한 포인터를 포함해야하며, 여기에는 프로그램 시작 이전에 호스트 환경에 의해 구현 정의 된 값이 제공됩니다. 의도는 호스팅 된 환경의 다른 곳에서 프로그램 시작 전에 결정된 프로그램 정보를 제공하는 것입니다. 호스트 환경에서 문자열에 문자가 대문자와 소문자 모두에 문자열을 공급할 수없는 경우, 구현은 문자열을 소문자로 수신해야합니다.
  • 값의 경우 argc 0보다 크고 문자열은 다음을 가리 킵니다. argv[0]프로그램 이름을 나타냅니다. argv[0][0] 호스트 환경에서 프로그램 이름을 사용할 수없는 경우 널 문자가되어야합니다. 값의 경우 argc 하나보다 크고, 줄은 argv[1] ~을 통해 argv[argc-1]프로그램 매개 변수를 나타냅니다.
  • 매개 변수 argc 그리고 argv 그리고 줄은 argv 배열은 프로그램에 의해 수정 될 수 있으며 프로그램 시작과 프로그램 종료 사이에 마지막으로 저장된 값을 유지해야합니다.

10) 따라서, int 정의 된 typedef 이름으로 대체 할 수 있습니다 int, 또는 유형 argv 작성할 수 있습니다 char **argv, 등등.

C99 또는 C11의 프로그램 종료

반환 된 값 main() 구현 정의 된 방식으로 '환경'으로 전송됩니다.

5.1.2.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도 참조하십시오. 255보다 큰 종료 코드 - 가능합니까?.

C89 (및 따라서 Microsoft C)에서는 main() 함수는 반환하지만 반환 값을 지정하지는 않습니다. 따라서 정의되지 않은 행동으로 이어집니다.

7.22.4.4 exit 기능

¶5 마지막으로, 제어는 호스트 환경으로 반환됩니다. 값의 경우 status 0 또는 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] NTMBSS (Null-Terminated Multibyte Strings) (17.5.2.1.4.2) 및 argv[0] 프로그램을 호출하는 데 사용되는 이름을 나타내는 NTMB의 초기 문자에 대한 포인터가되어야합니다. "". 의 가치 argc 음성이 없어야합니다. 의 가치 argv[argc]참고 : 더 이상 (선택 사항) 매개 변수를 추가하는 것이 좋습니다. argv. - 엔드 참고

¶3 기능 main 프로그램 내에서 사용되지 않아야합니다. 연결 (3.5) main 구현 정의입니다. [...

¶5 메인의 리턴 명령문은 기본 기능을 남기고 (자동 저장 시간이있는 개체 파괴) 및 호출의 효과가 있습니다. std::exit 반환 값을 인수로 사용합니다. 컨트롤이 반환 문을 만나지 않고 메인 종말에 도달하는 경우

return 0;

C ++ 표준은 "IT [기본 함수]는 반환 유형의 유형이 있어야한다고 명시 적으로 말합니다. int, 그러나 그렇지 않으면 그 유형은 구현이 정의되어 있으며 "옵션으로 지원되는 C 표준과 동일한 두 서명이 필요합니다. 따라서 'void main ()'는 C ++ 표준에 의해 직접 허용되지 않지만 할 수있는 일은 없습니다. 대안을 허용하는 비표준 구현을 중지하십시오. C ++는 사용자가 전화하는 것을 금지합니다. main (그러나 C 표준은 그렇지 않습니다).

§18.5의 단락이 있습니다 시작 및 종료 §7.22.4.4의 단락과 동일한 C ++ 11 표준에서 그만큼 exit 기능 C11 표준 (위에 인용)에서 각주와는 별도로 EXIT_SUCCESS 그리고 EXIT_FAILURE 정의되어 있습니다 <cstdlib>).

표준 C - 공통 확장

고전적으로 UNIX 시스템은 세 번째 변형을 지원합니다.

int main(int argc, char **argv, char **envp) { ... }

세 번째 인수는 문자열에 대한 널리 터진 포인터 목록이며, 각각은 이름, 동등한 부호 및 값 (아마도 비어 있음)을 갖는 환경 변수입니다. 이것을 사용하지 않으면 여전히 환경에 도달 할 수 있습니다.extern char **environ;'. 오랫동안, 그것은 그것을 선언 한 헤더가 없었지만 posix 2008 표준은 이제 선언해야합니다 <unistd.h>.

이는 C 표준에 의해 부록 J에 문서화 된 공통 확장으로 인식됩니다.

J.5.1 환경 주장

¶1 호스팅 된 환경에서 주요 기능은 세 번째 인수를 받고, char *envp[], 그것은 null이 종결 된 포인터 배열을 가리 킵니다. char, 각각은 프로그램 실행을위한 환경에 대한 정보를 제공하는 문자열을 가리 킵니다 (5.1.2.2.1).

마이크로 소프트 c

그만큼 Microsoft vs 2010 컴파일러는 흥미 롭습니다. 웹 사이트는 다음과 같이 말합니다.

메인에 대한 선언문 구문

 int main();

또는 선택적으로

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

대안 적으로, main 그리고 wmain 기능은 반환으로 선언 될 수 있습니다 void (반환 값 없음). 당신이 선언한다면 main 또는 wmain returning void로, return 문을 사용하여 종료 코드를 부모 프로세스 또는 운영 체제로 반환 할 수 없습니다. 종료 코드를 반환합니다 main 또는 wmain 로 선언됩니다 void, 당신은 그것을 사용해야합니다 exit 기능.

프로그램이있을 때 어떤 일이 발생하는지 명확하지 않습니다 (부모 또는 OS로 반환되는 출구 코드) void main() 종료 - MS 웹 사이트도 침묵합니다.

흥미롭게도 MS는 main() C 및 C ++ 표준에 필요합니다. 세 번째 인수가있는 세 가지 인수 형식 만 처방합니다. char **envp, 환경 변수 목록에 대한 포인터.

Microsoft 페이지에는 다른 대안이 있습니다. wmain() 넓은 문자열이 필요합니다.

마이크로 소프트 Visual Studio 2005 버전 이 페이지 나열되지 않습니다 void main() 대안으로. 그만큼 버전 Microsoft에서 Visual Studio 2008 이후에.

표준 C - 독립 환경

초기에 언급했듯이 위의 요구 사항은 호스팅 된 환경에 적용됩니다. 독립 환경 (호스팅 된 환경의 대안)과 함께 일하는 경우 표준은 말할 것도 훨씬 적습니다. 독립 환경의 경우 프로그램 스타트 업에서 호출 된 기능을 호출 할 필요가 없습니다. main 그리고 반환 유형에는 제약이 없습니다. 표준은 말한다 :

5.1.2 실행 환경

두 개의 실행 환경이 정의됩니다 : 독립형 및 호스팅. 두 경우 모두, 프로그램 시작은 지정된 C 함수를 실행 환경에서 호출 할 때 발생합니다. 정적 저장 시간이있는 모든 객체는 프로그램 시작 전에 초기화 (초기 값으로 설정)해야합니다. 그러한 초기화의 방식과 타이밍은 그렇지 않으면 지정되지 않습니다. 프로그램 종료는 실행 환경에 대한 제어를 반환합니다.

5.1.2.1 독립 환경

독립형 환경 (C 프로그램 실행이 운영 체제의 혜택없이 발생할 수 있음)에서 프로그램 시작에서 호출 된 기능의 이름과 유형은 구현 정의됩니다. 4 항에 의해 요구되는 최소 세트 이외의 독립형 프로그램에서 이용할 수있는 모든 라이브러리 시설은 구현 정의된다.

독립 환경에서 프로그램 종료의 효과는 구현 정의됩니다.

4 항에 대한 상호 참조는 다음을 의미합니다.

¶5 a 엄격하게 준수하는 프로그램 이 국제 표준에 명시된 언어 및 도서관의 기능 만 사용해야합니다.3) 지정되지 않은, 정의되지 않은 또는 구현 정의 된 동작에 따라 출력을 생성하지 않으며 최소 구현 한도를 초과해서는 안됩니다.

¶6 두 가지 형태의 순응 구현은 다음과 같습니다 호스팅 그리고 자유로운 무대. ㅏ 호스팅 된 구현을 준수합니다 엄격하게 준수하는 프로그램을 수락해야합니다. ㅏ 독립형 구현을 준수합니다 라이브러리 조항 (절 7 항)에 지정된 기능의 사용이 표준 헤더의 내용에 국한되는 엄격하게 준수하는 프로그램을 수락해야합니다. <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>, 그리고 <stdnoreturn.h>. 순응 구현에는 확장 프로그램의 동작을 변경하지 않는 경우 (추가 라이브러리 기능 포함) 확장 (추가 라이브러리 기능 포함)이있을 수 있습니다.4)

¶7 a 준수 프로그램 순응 구현에 허용되는 것입니다.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 두 종류의 구현이 정의되어 있습니다. a 호스팅 된 구현 그리고 a 독립형 구현. 호스팅 된 구현을 위해이 국제 표준은 사용 가능한 라이브러리 세트를 정의합니다. 독립형 구현은 운영 체제의 이점없이 실행이 이루어질 수 있으며 특정 언어 지원 라이브러리 (17.6.1.3)를 포함하는 구현 정의 된 라이브러리 세트가 있습니다.

¶8 잘 구성된 프로그램의 동작을 변경하지 않는 한, 일치하는 구현에는 확장 (추가 라이브러리 기능 포함)이있을 수 있습니다. 구현은이 국제 표준에 따라 잘못된 확장을 사용하는 프로그램을 진단하기 위해 필요합니다. 그러나 그렇게 한 후에는 그러한 프로그램을 컴파일하고 실행할 수 있습니다.

¶9 각 구현에는 모든 로케일 별 특성을 지원하지 않고 정의하는 모든 조건부 지원 구성을 식별하는 문서가 포함되어야합니다.3

3) 이 문서는 또한 구현 정의 된 동작을 정의합니다. 1.9 참조.

17.6.1.3 독립형 구현 [준수

두 가지 종류의 구현이 정의됩니다 : 호스팅 및 독립형 (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.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;
}

나는 그것을 믿는다 main() 반환해야합니다 EXIT_SUCCESS 또는 EXIT_FAILURE. 그들은 정의되어 있습니다 stdlib.h

C 및 C ++ 표준은 두 가지 종류의 구현을 정의합니다 : 독립형 및 호스팅.

  • C90 호스팅 환경

    허용 양식 1:

    int main (void)
    int main (int argc, char *argv[])
    
    main (void)
    main (int argc, char *argv[])
    /*... etc, similar forms with implicit int */
    

    코멘트:

    전자 두 사람은 허용 된 양식으로 명시 적으로 명시되어 있으며, C90은 반환 유형 및 함수 매개 변수에 "암시 적 int"를 허용하기 때문에 암시 적으로 허용됩니다. 다른 형태는 허용되지 않습니다.

  • C90 독립 환경

    메인 이름이 허용됩니다 2.

  • C99 호스팅 환경

    허용 양식 3:

    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.

    그러나 호스팅 된 환경 프로그램 종료 섹션은 Main이 int를 반환하지 않는 경우에 대해 논쟁합니다. 5. 그 섹션은 메인을 어떻게 선언 해야하는지에 대한 규범 적이지는 않지만, 메인은 호스팅 된 시스템에서도 완전히 구현 된 방식으로 선언 될 수 있음을 분명히 의미합니다.

  • C99 독립형 환경

    메인 이름이 허용됩니다 6.

  • C11 호스팅 환경

    허용 양식 7:

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
    
  • C11 독립형 환경

    메인 이름이 허용됩니다 8.


주목하십시오 int main() 위의 버전 중 하나에서 호스팅 된 C 구현에 대한 유효한 양식으로 나열되지 않았습니다. C에서 C ++와 달리 () 그리고 (void) 다른 의미가 있습니다. 전자는 언어에서 제거 될 수있는 노란 기능입니다. C11 미래 언어 방향을 참조하십시오.

6.11.6 기능 선언자

빈 괄호가있는 함수 선언자 (프로토 타입 형식 매개 변수 유형 선언자가 아님)를 사용하는 것은 노란 기능입니다.


  • C ++ 03 호스팅 환경

    허용 양식 9:

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

    코멘트:

    첫 번째 형태의 빈 괄호를 기록하십시오. C ++에서 C ++와 C는 다릅니다. C ++에서는 함수가 매개 변수가 없음을 의미합니다. 그러나 C에서는 매개 변수가 필요할 수 있음을 의미합니다.

  • C ++ 03 독립형 환경

    스타트 업에서 호출 된 함수의 이름은 구현 정의입니다. 명명 된 경우 main() 명시된 양식을 따라야합니다 10:

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    
  • C ++ 11 호스팅 환경

    허용 양식 11:

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

    코멘트:

    표준의 텍스트는 변경되었지만 동일한 의미가 있습니다.

  • C ++ 11 독립형 환경

    스타트 업에서 호출 된 함수의 이름은 구현 정의입니다. 명명 된 경우 main() 명시된 양식을 따라야합니다 12:

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    

참조

  1. ANSI X3.159-1989 2.1.2.2 호스팅 환경. "프로그램 스타트 업"

    프로그램 스타트 업에서 호출 된 함수의 이름은 Main입니다. 구현은이 기능에 대한 프로토 타입을 선언하지 않습니다. 리턴 유형의 int와 매개 변수가없는 것으로 정의되어야합니다.

    int main(void) { /* ... */ } 
    

    또는 두 개의 매개 변수가있는 (여기서 ARGC 및 ARGV라고 불리며, 이름이 선언 된 기능에 국한적이므로 모든 이름을 사용할 수 있지만) :

    int main(int argc, char *argv[]) { /* ... */ }
    
  2. ANSI X3.159-1989 2.1.2.1 독립 환경 :

    독립형 환경 (C 프로그램 실행이 운영 체제의 혜택없이 발생할 수 있음)에서 프로그램 시작에서 호출 된 기능의 이름과 유형은 구현 정의됩니다.

  3. ISO 9899 : 1999 5.1.2.2 호스팅 환경 -> 5.1.2.2.1 프로그램 시작

    프로그램 스타트 업에서 호출 된 함수의 이름은 Main입니다. 구현은이 기능에 대한 프로토 타입을 선언하지 않습니다. 리턴 유형의 int와 매개 변수가없는 것으로 정의되어야합니다.

    int main(void) { /* ... */ } 
    

    또는 두 개의 매개 변수가있는 (여기서 ARGC 및 ARGV라고 불리며, 이름이 선언 된 기능에 국한적이므로 모든 이름을 사용할 수 있지만) :

    int main(int argc, char *argv[]) { /* ... */ }
    

    또는 동등한; 9) 또는 다른 구현 정의 된 방식으로.

  4. 국제 표준 근거 - 프로그래밍 언어 - C, 개정 5.10. 5.1.2.2 호스팅 환경 -> 5.1.2.2.1 프로그램 시작

    메인에 대한 논쟁의 행동과 출구, 메인 및 atexit의 상호 작용 (§7.20.4.2 참조)은 Argv 현의 표현에서 원치 않는 다양성을 억제하기 위해 체계화되었으며, 주에 의해 반환 된 값의 의미에서.

    메인에 대한 인수로서 ARGC와 ARGV의 사양은 광범위한 사전 관행을 인식합니다. ARGV [ARGC]는 일반적인 관행에 기초하여 목록의 끝을 중복 점검하기 위해 널 포인터 여야합니다.

    메인은 제로 또는 두 인수로 포괄적으로 선언 될 수있는 유일한 기능입니다. (다른 기능의 인수의 수는 호출과 정의 사이에 정확히 일치해야합니다.)이 특별한 경우는 프로그램이 프로그램 인수 문자열에 액세스하지 않을 때 인수를 메인으로 남겨 두는 광범위한 관행을 인식합니다. 많은 이행이 주된 두 가지 이상의 주장을지지하지만, 그러한 관행은 표준에 의해 축복 받거나 금지되지 않습니다. 세 가지 인수로 메인을 정의하는 프로그램은 엄격하게 준수하지 않습니다 (§j.5.1 참조).

  5. ISO 9899 : 1999 5.1.2.2 호스팅 환경 -> 5.1.2.2.3 프로그램 종료

    기본 함수의 리턴 유형이 int와 호환되는 유형 인 경우, 초기 호출에서 기본 기능으로의 수익은 기본 함수에 의해 반환 된 값이 인수로 반환 된 값으로 출구 함수를 호출하는 것과 같습니다. 11) } 주 함수가 0의 값을 반환합니다. 리턴 유형이 int와 호환되지 않으면 호스트 환경에 반환 된 종료 상태는 지정되지 않습니다.

  6. ISO 9899 : 1999 5.1.2.1 독립 환경

    독립형 환경 (C 프로그램 실행이 운영 체제의 혜택없이 발생할 수 있음)에서 프로그램 시작에서 호출 된 기능의 이름과 유형은 구현 정의됩니다.

  7. ISO 9899 : 2011 5.1.2.2 호스팅 환경 -> 5.1.2.2.1 프로그램 시작

    이 섹션은 위에서 인용 한 C99와 동일합니다.

  8. ISO 9899 : 1999 5.1.2.1 독립 환경

    이 섹션은 위에서 인용 한 C99와 동일합니다.

  9. ISO 14882 : 2003 3.6.1 주요 기능

    구현은 기본 기능을 사전 정의해서는 안됩니다. 이 기능은 과부하되지 않아야합니다. 반환 유형의 유형 int가 있지만 그렇지 않으면 유형이 구현 정의됩니다. 모든 구현은 다음 주 정의를 모두 허용해야합니다.

    int main() { /* ... */ }
    

    그리고

    int main(int argc, char* argv[]) { /* ... */ }
    
  10. ISO 14882 : 2003 3.6.1 주요 기능

    주 기능을 정의하기 위해 독립 환경의 프로그램이 필요한지 여부는 구현이 정의됩니다.

  11. ISO 14882 : 2011 3.6.1 주요 기능

    구현은 기본 기능을 사전 정의해서는 안됩니다. 이 기능은 과부하되지 않아야합니다. 반환 유형의 유형 int가 있지만 그렇지 않으면 유형이 구현 정의됩니다. 모든 구현은 둘 다 허용해야합니다

    - () reture int and의 함수

    - (int, 포인터에 대한 포인터에 대한 포인터)의 함수 int의 함수

    메인 유형 (8.3.5).

  12. ISO 14882 : 2011 3.6.1 주요 기능

    이 섹션은 위에서 인용 한 C ++ 03과 동일합니다.

성공에서 0을 반환하고 0이 아닌 오류에 대해서는 0을 반환하십시오. 이것은 UNIX 및 DOS 스크립팅에서 사용하는 표준으로 프로그램에서 무슨 일이 일어 났는지 알아냅니다.

main() C89 및 K & R C에서 지정되지 않은 반환 유형 기본값은 'int'로 기본값입니다.

return 1? return 0?
  1. 반환 문을 작성하지 않는 경우 int main(), 폐쇄 { 기본적으로 0을 반환합니다.

  2. return 0 또는 return 1 부모 과정에서받습니다. 쉘에서 쉘 변수로 들어가고 프로그램을 실행하는 경우 쉘을 형성하고 해당 변수를 사용하지 않으면 반환 값에 대해 걱정할 필요가 없습니다. main().

보다 내 주요 기능이 반환 한 것을 어떻게 얻을 수 있습니까?.

$ ./a.out
$ echo $?

이렇게하면 변수임을 알 수 있습니다. $? 반환 값의 가장 중요한 바이트를받는 main().

UNIX 및 DOS 스크립팅에서 return 0 성공시 및 0이 아닌 오류가 일반적으로 반환됩니다. 이것은 UNIX 및 DOS 스크립팅에서 사용하는 표준으로 프로그램에서 무슨 일이 있었는지 알아 내고 전체 흐름을 제어합니다.

int를 반환하더라도 일부 OS (Windows)는 반환 된 값을 단일 바이트 (0-255)로 잘라냅니다.

운영 체제에서 리턴 값을 사용하여 프로그램 폐쇄 방법을 확인할 수 있습니다.

반환 값 0은 일반적으로 대부분의 운영 체제에서 확인을 의미합니다 (어쨌든 생각할 수있는 것).

프로세스를 직접 호출 할 때 확인하고 프로그램이 종료되어 제대로 완료되었는지 확인할 수 있습니다.

이것의 아니다 단지 프로그래밍 컨벤션.

반환 값 main() 프로그램이 어떻게 종료되었는지 보여줍니다. 반환 값이있는 경우 zero 그것은 실행이 성공적 이었음을 의미하는 반면, 0이 아닌 값은 실행에서 무언가가 나빠 졌다는 것을 나타냅니다.

표준은 메인이 성공적인 수익률이 OS 기반이기 때문에 메인이 반환 값이 필요하지 않다고 명시했다는 인상을 받았습니다 (0은 0의 0은 다른 사람의 성공 또는 실패 일 수 있음). 따라서 수익의 부재는 성공적인 반환 자체를 삽입하는 컴파일러.

그러나 나는 보통 0을 반환합니다.

반환 0은 프로그래머에게 프로그램이 성공적으로 작업을 마쳤다고 말해야합니다.

생략 return 0

C 또는 C ++ 프로그램이 끝날 때 main 컴파일러는 자동으로 코드를 반환 할 코드를 생성하므로 넣을 필요가 없습니다. return 0; 명시 적으로 끝에 main.

메모: 내가이 제안을 할 때, 그것은 거의 항상 두 가지 종류의 의견 중 하나 인 "나는 그것을 몰랐습니다." 또는 "나쁜 조언입니다!" 저의 근거는 표준에 의해 명시 적으로 지원되는 컴파일러 동작에 의존하는 것이 안전하고 유용하다는 것입니다. C의 경우, C99 이후; ISO/IEC 9899 : 1999 섹션 5.1.2.2.3을 참조하십시오.

...] 초기 호출에서 main 함수는 호출과 동일합니다 exit 값이 반환 한 값으로 기능합니다 main 그 주장으로서 기능한다. 도달 } 그것은 종료됩니다 main 함수는 0의 값을 반환합니다.

1998 년 첫 표준 이후 C ++의 경우; ISO/IEC 14882 : 1998 섹션 3.6.1을 참조하십시오.

컨트롤이 반환 문을 만나지 않고 메인의 끝에 도달하는 경우, 효과는 반환 0을 실행하는 것입니다.

그 이후로 두 표준의 모든 버전 (C99 및 C ++ 98)은 동일한 아이디어를 유지했습니다. 우리는 C ++에서 자동으로 생성 된 멤버 기능에 의존하며 명시 적 글을 쓰는 사람은 거의 없습니다. return; a의 끝에 진술 void 기능. 생략하는 것에 대한 이유는 귀여워 보입니다 "이상해 보인다". 나처럼 C 표준 변경에 대한 이론적 근거에 대해 궁금한 점이 있다면 이 질문을 읽으십시오. 또한 1990 년대 초에 이것은 당시에는 정의되지 않은 행동 (널리 지원되었지만)이기 때문에 "조잡한 연습"으로 간주되었다는 점에 유의하십시오.

또한, C ++ 코어 가이드 라인 생략의 여러 인스턴스가 포함되어 있습니다 return 0; 끝에 main 그리고 명백한 반환이 쓰여지는 사례는 없습니다. 이 문서 에서이 특정 주제에 대한 구체적인 지침은 아직 없지만, 적어도 관행의 암묵적인 승인 인 것 같습니다.

그래서 나는 그것을 생략하는 것을 옹호합니다. 다른 사람들은 어떤 경우에도, 당신이 그것을 생략하는 코드를 만나면, 표준에 의해 명시 적으로 지원되며 그것이 무엇을 의미하는지 알게 될 것입니다.

반품해야 할 것은 실행 파일로 무엇을하고 싶은지에 따라 다릅니다. 예를 들어 명령 줄 쉘로 프로그램을 사용하는 경우 성공을 위해 0을 반환하고 실패를 위해 0을 반환해야합니다. 그런 다음 코드 결과에 따라 조건부 처리와 함께 쉘에서 프로그램을 사용할 수 있습니다. 또한 해석에 따라 0이 아닌 값을 할당 할 수 있습니다. 예를 들어 중요한 오류에 대해 다른 프로그램 종료 포인트가 다른 종료 값을 가진 프로그램을 종료 할 수 있으며, 이는 반환 된 값을 검사하여해야 할 일을 결정할 수있는 호출 쉘에서 사용할 수있는 프로그램을 종료 할 수 있습니다. 코드가 쉘과 함께 사용하기위한 것이 아니고 반환 된 값이 아무도 귀찮게하지 않으면 생략 될 수 있습니다. 나는 개인적으로 서명을 사용합니다 int main (void) { .. return 0; .. }

프로세스에서 정수를 반환하는 효율성과 관련된 문제가있는 경우 해당 프로세스를 여러 번 호출 하여이 반환 값이 문제가되는 것을 피해야합니다.

이 작업을 수행하는 경우 (여러 번 프로세스를 호출) 각 통화에 대한 특정 프로세스를 할당하지 않고 발신자 또는 DLL 파일에 직접 논리를 배치하는 방법을 찾아야합니다. 다중 프로세스 할당은이 경우 관련 효율성 문제를 가져옵니다.

세부적으로, 0 리턴이 반환 1보다 효율적이든 효율적인지 여부를 알고 싶다면 경우에 따라 컴파일러에 의존 할 수 있지만 일반적으로 동일한 소스 (로컬, 필드, 상수, 임베디드에서 읽는다 고 가정합니다. 코드에서 기능 결과 등)에서는 정확히 동일한 수의 클록 사이클이 필요합니다.

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이 아닙니다. 다시 말하지만, 선택해야 할 것이 아닙니다.

다음은 반품 코드 사용에 대한 작은 데모입니다 ...

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 리턴 1을 만들기 때문에 두 번째 줄에 아무것도 인쇄되지 않으며 GREP의 반환 코드가 0인지 확인합니다. == 1.

당신이 이것을 호출하는지 알 수 있듯이, 그 과정은 때때로 그것이 반환 한 내용을 보는 것이 필수적입니다 (main ()의 반환 값에 따라).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top