我已经阅读了int main (int argc, char *argv[])
的libc参考,以及c++ ISO文档中当前工作标准中的3.6.1节"Main function"。我还读了一些关于参考文献的资料。我理解它们不能被重新分配,它们必须只有一层深度,等等。
也就是说,为什么标准int main (int argc, char *argv[])
而不是int main (int argc, char * &argv)
是一个"数组"/数据块,保存对参数的引用?
我的意思是为什么数组数组(char **argv)不属于程序,可以在运行时更改/移动,而不是内存,根据其定义,如果没有程序的同意和适当的处理(例如通过信号)不能修改?我错过了什么?
首先,考虑char*
意味着c_string
,那么您需要int main(int argc, c_string argv[])
而不是int main(int argc, c_string& argv)
的原因就很明显了。毕竟,程序可以接受多个形参。
由于引用数组(如果允许的话)每个索引只能保存一个字符,由于引用不能用于查找下一个字符(如果不接受它的引用,从而将其转换为指针),因此这也没有任何意义。
参数数组不为程序所有的假设为假。1999年和2011年的C标准明确规定:
形参argc和argv,以及argv数组所指向的字符串可被程序修改,并在程序之间保留它们最后存储的值启动和程序终止。
而我的c++标准草案并没有说相反的话。
正如@Red Alert所说,你混淆了"main"的重新声明,但我将回答我认为你问的问题。
程序参数由操作系统提供,因此实际上不属于程序所有。请记住,C/c++旨在实现低层次和高效,因此应该避免额外的参数副本。我还没见过有人在运行的程序中更改它们,但是在Linux中有几种方法可以在程序外检索它们。
还要考虑与C的兼容性,在C中没有这样的"&"操作符,并且"main"声明继承自C。
首先,c++中没有"引用数组"这样的东西。标准明确禁止它(§8.3.2 [dcl.ref]/5):
不能有对引用的引用,不能有对运行时约束的数组的引用,不能有引用的数组,不能有指向引用的指针。
第二,即使有这样的事情,向后兼容性需求也会对这样的更改产生极大的影响,这会毫无理由地破坏大量使用int main(int argc, char *argv[])
的现有代码。