【问题标题】:C++ references to main parametersC++ 对主要参数的引用
【发布时间】:2026-01-17 15:20:04
【问题描述】:

我已阅读 the libc reference 中的 int main (int argc, char *argv[]),以及 current working standard of the C++ ISO documentation 中的第 3.6.1 节“主要功能”。我还阅读了一堆关于参考的内容。我知道它们不能被重新分配,它们必须只有一层深,等等。

也就是说,为什么标准的int main (int argc, char *argv[]) 而不是int main (int argc, char * &argv) 是一个“数组”/数据块来保存对参数的引用?

我的意思是为什么有一个不属于程序的数组(char **argv),并且可以在运行时更改/移动,而不是根据其定义在没有程序的情况下无法修改的内存同意和适当的处理(例如通过信号)?我错过了什么?

【问题讨论】:

  • char * &argv 将引用单个字符数组,而不是所有参数。

标签: c++ parameter-passing main


【解决方案1】:

首先,考虑char* 的意思是c_string,你会立即明白为什么你需要int main(int argc, c_string argv[]) 而不是int main(int argc, c_string& argv)。毕竟,程序可以接受多个参数。

由于引用数组(如果允许的话)每个索引只能保存一个字符,因为引用不能用于查找下一个字符(不获取它的引用,因此将其转换为指针),这也没有任何意义。

参数数组不属于程序的假设是错误的。 1999 年和 2011 年的 C 标准明确规定:

参数 argc 和 argv 以及 argv 数组所指向的字符串应 可由程序修改,并在程序之间保留它们最后存储的值 启动和程序终止。

而我的 C++1y 标准草案副本并没有相反的说法。

【讨论】:

  • 在这种情况下,是说操作系统知道的最后存储的值还是程序,例如。它们可以更改,但必须恢复到终止时的状态,或者可以更改,但终止时只能清理。
  • 另外,参数字符串不是带有终端'\0',如果是这样,那不是长度而不是每个索引的单个字符吗?哪里只引用第一个字符,但从数据中可以看出完整的 cstring?
【解决方案2】:

正如@Red Alert 所说,您对“main”的重新声明感到困惑,但我会回答我认为您问的问题。

程序参数由操作系统提供,因此实际上不属于程序。请记住,C/C++ 旨在实现低级和高效,因此应避免额外的参数副本。我还没有看到有人在正在运行的程序上实际更改它们,但是有几种方法,例如Linux 在程序之外检索它们。

还要考虑与 C 的兼容性,你在 C 中没有这种方式的“&”运算符,而“main”声明是从 C 继承的。

【讨论】:

  • 效率部分在这里很有意义,因为操作系统可以为不同的程序重用参数。兼容性似乎也很合理。
【解决方案3】:

首先,C++ 中没有“引用数组”这样的东西。该标准明确禁止它(§8.3.2 [dcl.ref]/5):

不得有对引用的引用,不得有对运行时绑定数组的引用,不得有引用数组,也不得有指向引用的指针。

其次,即使有这样的事情,向后兼容性要求也会对这样的更改产生极大的影响,这会无缘无故地破坏大量使用 int main(int argc, char *argv[]) 的现有代码。

【讨论】:

  • 引用数组可能是原因。从 CS 的角度来看,我仍然不确定为什么要以这种方式构造参数,但在这种语言的上下文中它是有意义的。