为什么我们需要argc而argv的末尾总是空?
看来argv[argc]
总是为NULL
,所以我认为我们可以在没有argc
情况下遍历参数列表。 一个while
循环将做到这一点。
如果在argv
结尾处总是有一个NULL
,为什么我们需要一个argc
?
是的, argv[argc]==NULL
保证。 见C11 5.1.2.2.1程序启动 (我强调)
如果声明了,主函数的参数应该遵守以下约束条件:
argc的值应该是非负的。 argv [argc]应该是一个空指针。
因此提供argc
并不重要,但仍然有用。 除此之外,它允许快速检查正确的参数数目已被传递。
编辑:该问题已被修改,以包括C ++。 n3337草稿3.6.1主要function说
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;
这样的语句来修复(void)argc;
这会导致名称被使用而不生成任何代码。
argc
很高兴,因为否则许多程序将需要走参数来计算。 另外,在许多具有长度的数组的编程语言中,没有任何argc
参数,只有一个数组。