Зачем нам нужен argc, когда в конце argv всегда есть null?



кажется,argv[argc] всегда NULL, поэтому я думаю, что мы можем пройти список аргументов без argc. Один while цикл будет этого делать.



если есть NULL в конце argv, зачем нужен argc?

601   4  

4 ответов:

да argv[argc]==NULL гарантируется. Смотрите C11 5.1.2.2.1 запуск программы (Курсив мой)

если они объявлены параметры функции main должны подчиняться следующие ограничения:

значение argc должно быть неотрицательным. argv[argc] должно быть null указатель.

предоставляет 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 приятно иметь, потому что в противном случае многие программы должны были бы ходить thorugh параметры, чтобы получить счет. Кроме того, во многих языках программирования с массивами, которые имеют длину, нет никакого argc параметр, есть только массив с элементами.

Comments

    Ничего не найдено.