IT

argv 끝에 항상 null이있는 동안 왜 argc가 필요합니까?

lottoking 2020. 7. 26. 11:52
반응형

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 프로그램 시작

광범위한 사전 관행 인정하기 위한 논거 의 지정 argcargv주장 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많은 변수 가 있지만 항목이있는 배열 만 있습니다.

참고 URL : https://stackoverflow.com/questions/18547114/why-do-we-need-argc-while-there-is-always-a-null-at-the-end-of-argv

반응형