似乎argv[argc]
总是NULL
,所以我认为我们可以在没有argc
的情况下遍历参数列表。一个单独的while
循环将完成此操作。
如果argv
的末尾总是有一个NULL
,为什么我们需要argc
?
是的,保证argv[argc]==NULL
。参见C11 5.1.2.2.1程序启动(我的重点)
如果已声明,则主函数的参数应遵守以下限制:
argc的值应为非负。argv[argc]应为null指针
因此,提供argc
并不重要,但仍然有用。除其他外,它还允许快速检查是否传递了正确数量的参数。
编辑:该问题已被修改为包含C++。n3337草案3.6.1主要功能表示
2。。。argc应为从运行程序的环境。。。。argc的值应为非阴性argv[argc]的值应为0。
是的,argv[argc]
保证为空指针。使用CCD_ 11是为了方便。
引用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;
这样的语句来修复,该语句会导致在不生成任何代码的情况下使用名称。
argc
很好,因为否则许多程序需要遍历参数才能获得计数。此外,在许多具有长度数组的编程语言中,并没有任何argc
参数,只有一个包含项的数组。
- 如果需要访问输入列表中的最后一个参数,则使用
argv[argc - 1]
比循环更方便 - 最好(更干净)将
argc
提供给我,而不是必须编写代码,在逻辑需要时单独给我计数(在某些情况下可能会发生这种情况)