argv[argc]
는 항상 있는 것 NULL
같으므로,없이 인수 목록을 탐색 할 수 있다고 생각합니다 argc
. 단일 while
루프가이를 수행합니다.
NULL
끝에 항상이있는 경우 argv
왜 우리는이 필요 argc
합니까?
답변
예, argv[argc]==NULL
보장됩니다. C11 5.1.2.2.1 프로그램 시작 (내 강조)을 참조하십시오.
선언 된 경우 주 기능에 대한 매개 변수는 다음 제약 조건을 준수해야합니다.
argc의 값은 음수가 아니어야합니다.
argv [argc]는 널 포인터 여야합니다.
argc
따라서 제공하는 것이 중요하지는 않지만 여전히 유용합니다. 무엇보다도 올바른 수의 인수가 전달되었는지 빠르게 확인할 수 있습니다.
편집 : 질문이 C ++를 포함하도록 수정되었습니다. n3337 draft 3.6.1 주요 기능 은
2 … argc는 프로그램이 실행되는 환경에서 프로그램으로 전달 된 인수의 수입니다. …. argc의 값은 음수가 아니어야합니다. argv [argc]의 값은 0이어야합니다 .
답변
예, argv[argc]
null 포인터가 보장됩니다. argc
편의를 위해 사용됩니다.
C99 Rationale의 공식 설명을 인용하면 중복 검사 라는 단어에 유의 하십시오 .
국제 표준의 근거 — 프로그래밍 언어 — C §5.1.2.2.1 프로그램 시작
광범위한 사전 관행 을 인식하기 위한 인수
argc
및 의 사양 . 목록의 끝 부분에 대한 중복 검사를 제공하기 위해 null 포인터 여야합니다.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
매개 변수 가없고 항목이있는 배열 만 있습니다.