main-C 不是 const 的原因

Reason main-C isn't const

我看到 main() 函数通常称为:

与这些定义相关:

  1. 从技术上讲,char** argvchar* argv[] 是一个优于另一个的首选还是它们 100% 可以互换?
  2. 因为 argc 和参数字符串(应该是?)不可变,为什么它们不都是 const ?或者这是无关紧要的东西,只是出于 convention/historical 的目的而被省略了?我想这可以通过以下方式完成:const char **argv = (const char **) argv; 但很好奇为什么这还没有完成(例如,是否有理由更改收到的参数?)

因为它们都是可修改的:

N1570 §5.1.2.2.1/2:

The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.

  1. 它们完全可以互换。
  2. 修改它们是有效的,有时程序中有一个命令行处理器链,每个处理器都会删除与其相关的选项,然后再将其传递给链中的下一个处理器。在这种情况下,argc 通过指针传递给处理器。您可以在 QT 库中看到一个示例,不是 C 而是 C++:QApplication constructor.

这里对 *argv[]**argv 之间的区别(或 non-distinction)进行了长时间的讨论:

Should I use char** argv or char* argv[]?

两者的使用都相当广泛,在此特定上下文中它们之间没有实际区别。

至于指针是否应该 const 不是——这是一个有趣的,但更像是学术辩论。我非常相信 C 中的 const-correctness,但是 main() 是我认为它是 counter-productive 的一个地方。无论这些指针是否真的是 const,或者您的代码是否将它们视为常量,写成 char **argv 都是惯用的。在 Linux 上,它们实际上 不是 常量 -- 程序可以修改它们,尽管很少需要这样做。

我的感觉是,如果您不写 char **argvchar *argv[],只会引起混乱。我最近看到 main() 被定义为采用 char *argv[argc+1] 的示例。这对于现代 C 编译器是允许的,但这不是 C 程序员习惯看到的东西。