似乎argv[argc]
总是NULL
,所以我认为我们可以在没有 的情况下遍历参数列表argc
。一个while
循环将执行此操作。
NULL
如果末尾总是有一个argv
,为什么我们需要一个argc
?
是的,argv[argc]==NULL
有保证。见C11 5.1.2.2.1 程序启动(我的重点)
如果它们被声明,主函数的参数应遵守以下约束:
argc 的值应为非负数。 argv[argc] 应该是一个空指针。
因此,提供argc
并不重要,但仍然有用。除此之外,它还允许快速检查是否传递了正确数量的参数。
编辑:问题已被修改为包括 C++。n3337 草案3.6.1 主要功能说
2 ...argc 应该是从程序运行的环境传递给程序的参数数量。.... argc 的值应为非负数。argv[argc] 的值应为 0。
是的,argv[argc]
保证是空指针。argc
用于方便。
引用 C99 Rationale 的官方解释,注意冗余检查:
国际标准的基本原理 - 编程语言 - 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
很好,因为否则许多程序需要遍历参数才能获得计数。此外,在许多具有长度数组的编程语言中,没有任何argc
参数,只有一个包含项目的数组。
argv[argc - 1]
比循环更方便。argc
提供给我,而不是编写代码,当逻辑需要我时(并且在某些情况下可能发生这种情况),将分别给我计数。