C++对main参数的引用

3
我已阅读libc参考文档中关于int main (int argc, char *argv[])的内容,以及C++ ISO文档当前工作标准中第3.6.1节“主函数”的相关内容。我也阅读了很多关于引用的文章。我知道它们不能被重新赋值,必须只有一层深等等。
话虽如此,为什么标准是int main (int argc, char *argv[])而不是int main (int argc, char * &argv),这样就可以将其视为一个“数组”/数据块,其中保存了参数的引用?
我的意思是,为什么要有一个数组(char **argv),它们不是程序所拥有的,并且在运行时可能会被更改/移动,而不是通过定义无法在没有程序同意和适当处理(例如通过信号)的情况下修改内存呢?我错过了什么吗?

1
char * &argv 是一个对单个字符数组的引用,而不是所有参数。 - Red Alert
3个回答

3
首先,考虑将char*视为,很快就会明白为什么需要int main(int argc, c_string argv[])而不是int main(int argc, c_string& argv)。毕竟,程序可能需要多个参数。
由于引用数组(如果允许)最终每个索引只能持有一个char,因为不能使用引用来找到下一个字符(除非对其进行引用并将其转换为指针),所以这也没有任何意义。
假设参数数组不归程序所有是错误的。C标准1999和2011明确规定:
“参数argc和argv以及argv数组指向的字符串应该可以被程序修改,并且在程序启动和结束之间保留它们的最后存储值。”
我的C++1y标准草案副本中也没有相反的说法。

在这种情况下,它是指操作系统知道的最后存储的值还是程序知道的值,例如,它们可以被更改,但必须在终止时将它们放回起始状态,或者它们可以被更改,但在终止时只能进行清理。 - ConfusedStack
此外,如果参数是以终止符 '\0' 的字符串,那么长度不就是每个索引上的单个字符,而不仅仅是一个字符吗?如果只有引用,则只会引用第一个字符,但完整的 cstring 将从数据中显现出来。 - ConfusedStack

2
作为@Red Alert所说,您已经混淆了“main”的重新声明,但我将回答我认为您提出的问题。
程序参数由操作系统提供,因此实际上不属于程序所有。请记住,C/C++旨在具有低级别和高效性,因此应避免额外拷贝参数。我没有见过有人在运行中的程序中实际改变它们,但在Linux等操作系统中,有几种方法可以在程序外部检索它们。
此外,请考虑与C的兼容性,在C中并没有以这种方式使用“&”运算符,并且“main”声明是从C继承的。

效率部分在这里是有意义的,因为操作系统可以重复使用不同程序的参数。兼容性也似乎是合理的。 - ConfusedStack

1
首先,在C++中不存在“引用数组”这样的东西。标准明确禁止它(§8.3.2 [dcl.ref]/5):
“不得有对引用的引用,不得有对运行时绑定数组的引用,不得有‘引用数组’,也不得有指向引用的指针。”
其次,即使有这样的东西,向后兼容性要求也会极大地影响这种改变,这将毫无理由地破坏许多现有代码使用int main(int argc, char *argv[])

数组引用可能是原因。从计算机科学的角度来看,我仍然不确定为什么你想以那种方式构造参数,但在这种语言环境下是有意义的。 - ConfusedStack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接