我理解,因为argc
是参数的数量,所以它可以是一个int。但为什么argv
属于char pointer
类型?这是否意味着我无法传递整数参数并在数学运算中使用argv[1]
?
修改:为了更清晰,可以编写类似int* argv[]
的内容。 argv
是否已定义为char*
类型,以便无法更改?
答案 0 :(得分:5)
实际上main
有两个有效的定义:
int main() { /* ... */ }
和
int main(int argc, char *argv[]) { /* ... */ }
或同等学历。 (请注意,作为参数,char *argv[]
等同于char **argv
,它更准确地表示它是什么,指向char
的指针。)
实施可以(但不是必须)支持其他形式;例如,某些系统支持额外的char *envp[]
参数。
main
的不寻常之处并不是它没有一个有效的定义。它与其他用户定义的功能不同,它没有无限多的功能。例如,您可以按照自己喜欢的方式定义名为foo
的函数。 main
的定义受到限制,因为它是您的计划的切入点,而调用环境必须知道如何调用它。
ISO C ++标准的第3.6.1节对此进行了更详细的介绍。 N4296是2014版的草稿。
如果要将整数作为命令行参数传递,请将它们作为字符串传递,然后解析它们。 (atoi()
函数是执行此操作的最简单方法之一,但它不会执行任何错误检查。std::stoi()
函数,在以{C}开头的<string>
标头中定义++ 11,更好。)
main
函数接受一个字符串列表(严格来说是指向char**
指针数组的初始元素的char*
指针,每个指针都指向一个字符串的开头)因为它是一个非常灵活的数据结构,但它并不过分复杂。 (注意&#34;字符串&#34;这里是一个C风格的字符串,一个由'\0'
空字符终止的字符序列 - 不要与由std::string
定义的getopt()
类型混淆C ++标准库。)
有各种用于解析命令行参数的开源库。例如,类Unix系统具有{{1}}功能;有关详细信息,请参阅其文档。