似乎argv[argc]
总是NULL
,所以我认为我们可以在没有argc
的情况下遍历参数列表。单个while
循环将执行此操作。
如果NULL
末尾始终有argv
,为什么我们需要argc
?
答案 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
的参数的argv
和main
的规范认可了广泛的先前实践。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
参数,只有一个包含项目的数组。