표준 C — 호스팅 환경
호스팅 환경 (일반적인 환경)의 경우 C11 표준 (ISO / IEC 9899 : 2011)은 다음과 같이 말합니다.
5.1.2.2.1 프로그램 시작
프로그램 시작시 호출 된 함수의 이름은 main
입니다. 구현은이 함수에 대한 프로토 타입을 선언하지 않습니다. 반환 유형 int
과 매개 변수없이 정의해야합니다 .
int main(void) { /* ... */ }
또는 두 개의 매개 변수가있는 경우 (여기서 as argc
및 참조) argv
, 선언 된 함수의 로컬 이름이므로 모든 이름을 사용할 수 있습니다.
int main(int argc, char *argv[]) { /* ... */ }
또는 동등한 것; 10) 또는 다른 구현 정의 방식으로.
이들이 선언되면, main 함수에 대한 매개 변수는 다음 제약 조건을 따라야합니다.
- 의 가치
argc
음수가 아니어야한다.
argv[argc]
널 포인터이어야한다.
- 의 값
argc
이 0보다 크면 배열 멤버 argv[0]
는
argv[argc-1]
논리합 프로그램을 시작하기 전에 호스트 환경 구현 정의 값을 주어진 문자열에 대한 포인터를 포함한다. 호스팅 환경의 다른 곳에서 프로그램을 시작하기 전에 결정된 프로그램 정보를 제공하기위한 것입니다. 호스트 환경에서 대문자와 소문자로 문자열을 제공 할 수없는 경우 구현시 문자열을 소문자로 수신해야합니다.
- 의 값
argc
이 0보다 큰 경우 by가 가리키는 문자열 argv[0]
은 프로그램 이름 을 나타냅니다. argv[0][0]
프로그램 이름을 호스트 환경에서 사용할 수없는 경우 널 문자 여야합니다. 의 값 argc
이 1보다 크면, 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
and 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 타입의 리턴 타입을 가져야하지만 그렇지 않으면 타입이 구현 정의됩니다. 모든 구현은 다음 main 정의를 모두 허용해야합니다.
int main() { /* ... */ }
과
int main(int argc, char* argv[]) { /* ... */ }
후자의 형식 argc
은 프로그램이 실행되는 환경에서 프로그램에 전달 된 인수의 수입니다. 경우 argc
이러한 인수를 공급해야한다 제로 이외의 argv[0]
를 통해 argv[argc-1]
널 (null)로 종료되는 멀티 바이트 문자열의 첫 문자 (NTMBSs) (17.5.2.1.4.2)에 대한 포인터로와 argv[0]
하는 데 사용되는 이름을 나타내는 NTMBS의 초기 문자에 대한 포인터한다 프로그램을 호출하십시오 ""
. 의 값은 argc
음수가 아니어야한다. 의 값은 argv[argc]
0이어야한다. [참고 : 이후에 (선택적) 파라미터를 더 추가 할 것을 권장한다 argv
. — 끝 노트]
¶3 기능 main
은 프로그램 내에서 사용되지 않아야합니다. 연계 (3.5) main
는 구현에 따라 정의됩니다. [...]
¶5 main의 return 문은 main 함수를 떠나고 (자동 저장 시간이있는 객체를 파괴 함) std::exit
return 값을 인수로 호출 하는 효과가 있습니다. 리턴 문이 발생하지 않고 제어가 메인의 끝에 도달하면 그 결과는 실행의 효과입니다
return 0;
C ++ 표준은 명시 적으로 "[주 함수]는 유형의 리턴 유형을 가져야 int
하지만 그렇지 않은 경우 유형이 구현 정의됩니다"라고 명시하고 C 표준과 동일한 두 서명을 옵션으로 지원해야합니다. 따라서 'void main ()'은 C ++ 표준에서 직접 허용되지 않지만 대안을 허용하는 비표준 구현을 중지하는 방법은 없습니다. C ++는 사용자가 호출 할 main
수 없도록합니다 (그러나 C 표준은 그렇지 않습니다).
C ++ 11 표준 에는 §7.22.4.4의 단락과 동일한 §18.5 시작 및 종료 단락이 있습니다.exit
기능 C11 표준에서 (위 인용)은 (따로 각주에서, 이는 단순히 문서 그 EXIT_SUCCESS
와 EXIT_FAILURE
정의 에서 <cstdlib>
).
표준 C — 공통 확장
일반적으로 Unix 시스템은 세 번째 변형을 지원합니다.
int main(int argc, char **argv, char **envp) { ... }
세 번째 인수는 null로 끝나는 문자열에 대한 포인터 목록으로, 각각 이름, 등호 및 값 (비어있을 수 있음)을 갖는 환경 변수입니다. 이것을 사용하지 않으면 여전히 ' extern char **environ;
' 를 통해 환경에 도달 할 수 있습니다 . 이 전역 변수는이를 선언하는 헤더가 없다는 점에서 POSIX의 고유 변수입니다.
이는 C 표준에 의해 부록 J에 문서화되어있는 공통 확장명으로 인식됩니다.
J.5.1 환경 인수
¶1 호스트 된 환경에서, main 함수는 char *envp[]
에 대한 널로 끝나는 포인터 배열을 가리키는 세 번째 인수를받습니다. char
각 포인터 는 프로그램의이 실행을위한 환경에 대한 정보를 제공하는 문자열을 가리 킵니다 (5.1. 2.2.1).
마이크로 소프트 C
마이크로 소프트 VS 2010 컴파일러는 흥미 롭다. 웹 사이트는 말합니다 :
main의 선언 구문은
int main();
또는 선택적으로
int main(int argc, char *argv[], char *envp[]);
또는 main
및 wmain
함수를 반환으로 선언 할 수 있습니다 void
(반환 값 없음). void 를 선언 main
하거나 wmain
리턴하면 return 문을 사용하여 종료 코드를 상위 프로세스 또는 운영 체제에 리턴 할 수 없습니다. main
또는 wmain
로 선언 되었을 때 종료 코드를 반환하려면 함수 void
를 사용해야합니다 exit
.
프로그램 void main()
이 종료 될 때 어떤 결과가 발생하는지 (부모 또는 OS에 어떤 종료 코드가 반환되는지) 명확하지 않으며 MS 웹 사이트도 자동입니다.
흥미롭게도 MS는 main()
C 및 C ++ 표준에 필요한 두 가지 인수 버전을 규정하지 않습니다 . char **envp
환경 변수 목록에 대한 포인터 인 세 번째 인수가있는 세 가지 인수 형식 만 규정 합니다.
Microsoft 페이지에는 다른 대안도 있습니다. wmain()
이 방법은 넓은 문자열을 사용하며 그 있습니다.
이 페이지 의 Microsoft Visual Studio 2005 버전은 대안으로 나열되지 않습니다 . 버전의 마이크로 소프트 비주얼 스튜디오 2008 년 이후 않습니다.void main()
표준 C — 독립형 환경
앞서 언급했듯이 위의 요구 사항은 호스팅 된 환경에 적용됩니다. 독립 환경 (호스트 환경의 대안)으로 작업하는 경우 표준에 대한 언급이 훨씬 적습니다. 독립형 환경의 경우 프로그램 시작시 호출 된 함수를 호출 할 필요 main
가 없으며 리턴 유형에 대한 제한이 없습니다. 표준은 말한다 :
5.1.2 실행 환경
독립형 및 호스팅의 두 가지 실행 환경이 정의됩니다. 두 경우 모두, 지정된 C 함수가 실행 환경에 의해 호출 될 때 프로그램 시작이 발생합니다. 정적 저장 기간을 가진 모든 객체는 프로그램 시작 전에 초기화되어야합니다 (초기 값으로 설정). 그러한 초기화의 방식 및 타이밍은 달리 명시되지 않는다. 프로그램 종료는 제어를 실행 환경으로 되돌립니다.
5.1.2.1 독립 환경
C 환경에서 운영 체제의 이점없이 C 프로그램이 실행될 수있는 독립 환경에서는 프로그램 시작시 호출되는 함수의 이름과 유형이 구현 정의됩니다. 조항 4에 의해 요구되는 최소 세트 이외의 독립 프로그램에 이용 가능한 모든 도서관 시설은 구현에 따라 정의됩니다.
독립 환경에서 프로그램 종료의 영향은 구현 정의됩니다.
조항 4 적합성에 대한 상호 참조는 다음과 같습니다.
¶5 엄격하게 준수하는 프로그램 은이 국제 표준에 명시된 언어 및 라이브러리의 기능 만 사용해야합니다. 3) 지정되지 않거나 정의되지 않은 또는 구현 정의 된 동작에 따라 출력을 생성하지 않아야하며 최소 구현 제한을 초과해서는 안됩니다.
¶6 준수 구현의 두 가지 형태는 호스팅 되고 독립형 입니다. 준수 호스팅 구현은 어떤 엄격하게 준수 프로그램을 수용하여야한다. 준수 자립 구현 라이브러리 절 (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 두 가지 종류의 구현이 정의되어있다 : 호스팅 구현 과 독립 구현 . 호스팅 된 구현의 경우이 국제 표준은 사용 가능한 라이브러리 세트를 정의합니다. 독립 실행 형 구현은 운영 체제의 이점없이 실행할 수 있으며 특정 언어 지원 라이브러리 (17.6.1.3)를 포함하는 구현 정의 라이브러리 세트를 가지고 있습니다.
¶8 적합한 구현은 올바른 형식의 프로그램의 동작을 변경하지 않는 한 확장 기능 (추가 라이브러리 기능 포함)을 가질 수 있습니다. 이 국제 표준에 따라 잘못된 확장을 사용하는 프로그램을 진단하려면 구현이 필요합니다. 그러나 그렇게하면 그러한 프로그램을 컴파일하고 실행할 수 있습니다.
¶9 각 구현은 지원하지 않는 모든 조건부 지원 구성을 식별하고 모든 로케일 특정 특성을 정의하는 문서를 포함해야합니다. 삼
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;
}