似乎argv[argc]
总是NULL
如此,因此我认为我们可以不用遍历参数列表argc
。一个while
循环就可以做到这一点。
如果总是NULL
在结尾处argv
,为什么我们需要一个argc
?
"\0"
与NULL指针不同(0
相当于C ++中的NULL)
似乎argv[argc]
总是NULL
如此,因此我认为我们可以不用遍历参数列表argc
。一个while
循环就可以做到这一点。
如果总是NULL
在结尾处argv
,为什么我们需要一个argc
?
"\0"
与NULL指针不同(0
相当于C ++中的NULL)
Answers:
是的,argv[argc]==NULL
有保证。参见C11 5.1.2.2.1程序启动(我的重点是)
如果声明了它们,则主函数的参数应遵守以下约束:
argc的值应为非负数。 argv [argc]应为空指针。
argc
因此,提供并不是至关重要的,但仍然有用。除其他外,它允许快速检查是否已传递了正确数量的参数。
编辑:该问题已被修改为包括C ++。n3337草案3.6.1主要功能说
2 ... argc是从运行程序的环境传递到程序的参数数。.... argc的值应为非负数。argv [argc]的值应为0。
argc
可能是相当大的,因为外壳是做扩展(所以ls *
在*
由前壳扩展execve
的/bin/ls
可执行文件)。在我的系统上,我可以拥有argc
数十万个。
argc
足够,所以这从来没有发生过,但是我绝对可以想到这种保证是相关的甚至是必要的情况。+1
argc
是过去,也是一件好事。
是的,argv[argc]
保证是空指针。argc
为方便起见。
引用C99基本原理的官方解释,请注意冗余检查一词:
国际标准的理由-编程语言 -C§5.1.2.2.1 程序启动
的规范
argc
和argv
作为main
广泛认可的先验实践的论据。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
参数,只有一个包含项的数组。
int argc(char *argv[])
执行此操作: