argv 끝에 항상 null이있는 동안 왜 argc가 필요합니까?
argv[argc]는 항상 것 NULL입니다. 그래서 우리는 인수 목록없이 순회 할 수 있다고 생각합니다 argc. 단일 while루프가이를 수행합니다.
NULL끝에 항상이있는 경우 argv왜 우리가 argc필요합니까?
예, argv[argc]==NULL보장됩니다. C11 5.1.2.2.1 프로그램 시작 참조 (내 강조)
선언 선언, main 함수에 대한 매개 변수는 다음 제약 조건을 따라야합니다.
argc의 값은 음이 아니어야합니다. argv [argc]는 널 포인터 집합니다.
argc그러므로 제공하는 것이 중요하지 않습니다. 무엇을 포함 개수의 인수가 전달되었는지 확인할 수 있습니다.
편집 : 질문이 C ++을 포함하도록 수정되었습니다. n3337 초안 3.6.1 주요 기능을 말한다
2 ... argc는 프로그램이 실행되는 환경에서 프로그램으로 전달되는 인수의 수입니다. .... argc의 값은 음수가 아니어야합니다. argv [argc]의 값은 0이어야 합니다.
예, argv[argc]널 포인터가 보장됩니다. argc편의상 사용됩니다.
C99의 공식 설명 이론을 인용하면 중복 검사 라는 단어에 유의 하십시오 .
국제 표준의 이론적 근거 — 프로그래밍 언어 — C §5.1.2.2.1 프로그램 시작
광범위한 사전 관행 을 인정하기 위한 논거 의 지정
argc및argv주장main.argv[argc]또한 목록의 끝에 대한 두 번째 검사를 제공하고 일반적인 행에 따라 널 포인터 관합니다.
역사적인 이유와 오래된 코드와의 때문입니다. 원래 argv 배열의 마지막 요소로 널 포인터가 존재한다는 보장은 없었습니다. 그러나 argc는 항상 존재했습니다.
다양한 표준에 필요하기 때문에 "필요"합니다.
첫 번째 변수를 main선택합니다. C ++ (그리고 아마도 비표준 C 방언)에서는 C ++ 스 니펫 (C로 쉽게 변환 할 수 있음)과 같이 다음 변수 이름을 생략 할 수 있습니다.
#include <stdio.h> // C-compatible include, guarantees puts in global namespace
// program will print contents of argv, one item per line, starting from argv[0]
int main(int /*argc*/, char *argv[]) { // uncomment argc for C
//(void)argc; // uncomment statement for C
for (int i=0; argv[i]; ++i) {
puts(argv[i]);
}
return 0;
}
일반적인 경고 설정으로 표준 C에서 사용하지 않는 매개 변수는 경고를 생성하며, (void)argc;코드를 생성하지 않고 이름을 사용하는 것과 같은 명령문으로 사용할 수 있습니다 .
argc다수의 프로그램이 계수를 위해 있기 때문에 변수를 따라 걸어야하기 때문에 많은 프로그램이 있습니다. 또한 길이가 긴 배열을 가진 많은 프로그래밍 언어에는 argc많은 변수 가 있지만 항목이있는 배열 만 있습니다.
'IT' 카테고리의 다른 글
| Intellij IDEA가 javadoc을 자동으로 표시 (0) | 2020.07.26 |
|---|---|
| 잘못된 스위프트 지원-파일이 일치하지 않습니다. (0) | 2020.07.26 |
| C #에서 재진입 잠금 (0) | 2020.07.26 |
| PhotoPicker 검색 오류 : 오류 도메인 = PlugInKit 코드 = 13 (0) | 2020.07.26 |
| 중첩 클래스의 범위? (0) | 2020.07.26 |