sourcecode

argv 끝에는 늘 늘이 있는데 argc가 필요한 이유는 무엇입니까?

copyscript 2022. 9. 16. 23:03
반응형

argv 끝에는 늘 늘이 있는데 argc가 필요한 이유는 무엇입니까?

아무래도...argv[argc]항상 있다NULL그래서, 나는 우리가 논쟁 목록을 통과할 수 있다고 생각한다.argc싱글.whileloop이 이 작업을 수행합니다.

항상 있는 경우NULL의 마지막에argv, 왜 필요한가?argc?

네.argv[argc]==NULL가 보증됩니다.C11 5.1.2.1 프로그램 부팅 참조(중요)

이러한 매개변수가 선언된 경우, 주 함수에 대한 매개변수는 다음과 같은 제약을 준수해야 한다.

argc의 값은 음이 아니어야 하며 argv[argc]는 늘 포인터여야 한다.

제공argc따라서 필수적이지는 않지만 여전히 유용합니다.무엇보다도, 정확한 수의 논쟁이 통과되었는지 빠르게 확인할 수 있습니다.

편집: 질문이 C++를 포함하도록 수정되었습니다. n3337 초안 3.6.1 주요 함수는 다음과 같습니다.

2...d5c는 프로그램이 실행되는 환경에서 프로그램으로 전달되는 인수 수입니다. ......argc 값은 음수가 아니어야 한다.argv[argc] 값은 0이어야 한다.

역사적 이유와 오래된 코드와의 호환성을 위해서입니다.원래 argv 배열의 마지막 요소로 늘 포인터가 존재한다는 보장은 없었습니다.하지만 argc는 항상 존재해왔다.

네.argv[argc]는 늘 포인터임을 보증합니다. argc편리함을 위해 사용됩니다.

C99 Regonics의 공식 설명을 인용하여 용장 검사라는 단어를 적어 둡니다.

국제표준 - 프로그래밍 언어 - C © 5.1.2.1 프로그램 부팅의 근거

의 사양argc그리고.argv의 논거로서main는 광범위한 선행 사례를 인식하고 있습니다. argv[argc]는, 리스트의 말미에 용장 체크를 실시하기 위해서도, 통상의 프랙티스에 근거해 늘 포인터로 할 필요가 있습니다.

다양한 기준에 의해 요구되기 때문에 우리는 그것을 "필요"하게 됩니다.

이 값은 완전히 무시해도 되지만 첫 번째 파라미터이기 때문에main파라미터 리스트에 그것이 있어야 합니다.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파라미터, 항목이 배열되어 있을 뿐입니다.

  • , "마지막 인수로 접근하다"를 사용하는 이 더 합니다.argv[argc - 1]루프가 아니라요.
  • 것이argc로직에서 필요한 경우(이러한 경우가 있습니다)에 카운트를 개별적으로 나타내는 코드를 쓸 필요가 없습니다.

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

반응형