为什么我们需要argc而argv结尾总是空?

时间:2013-08-31 10:26:53

标签: c++ c main

似乎argv[argc]总是NULL,所以我认为我们可以在没有argc的情况下遍历参数列表。单个while循环将执行此操作。

如果NULL末尾始终有argv,为什么我们需要argc

4 个答案:

答案 0 :(得分:102)

是的,保证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

答案 1 :(得分:43)

是的,argv[argc]保证是空指针。 argc用于方便使用。

引用C99基本原理的官方解释,注意冗余检查

  

Rationale for International Standard — Programming Languages — C§5.1.2.2.1程序启动

     

作为argc的参数的argvmain的规范认可了广泛的先前实践。 argv[argc]必须是一个空指针,以便在列表末尾提供冗余检查,同样基于通常的做法。

答案 2 :(得分:18)

这是出于历史原因以及与旧代码的兼容性。最初,不能保证存在空指针作为argv数组的最后一个元素。但argc 总是存在。

答案 3 :(得分:6)

我们“需要”它,因为它是各种标准所要求的。

我们可以完全忽略该值,但由于它是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参数,只有一个包含项目的数组。