main-C不是const的原因

问题描述

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

  • int main(int argc,char** argv)
  • int main(int argc,char* argv[])
  • int main(void)

与这些定义有关:

  1. 从技术上讲,对于char** argvchar* argv[]来说,一个相对于另一个更可取,还是100%可互换?
  2. 由于argc和参数字符串(应该是?)都是不可变的,为什么它们都不都是const?还是这无关紧要,只是出于惯例/历史目的而被忽略了?我想这可以通过以下方式完成:const char **argv = (const char **) argv;,但很好奇为什么尚未完成(例如,是否会有理由更改接收到的参数?)

解决方法

因为它们都是可修改的:

N1570§5.1.2.2.1/ 2:

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

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

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

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

两者都被广泛使用,在这种特定情况下它们之间没有实际区别。

关于指针是否应为const并不是一个有趣的问题,而是学术辩论。我非常相信C语言中的const正确性,但是main()是我认为适得其反的地方。无论这些指针是否真的是char **argv,还是您的代码是否将它们视为常量,编写const都是一种习惯。在Linux上,它们实际上不是常量-程序可以修改它们,尽管几乎不需要。

我的感觉是,如果您写的内容不是char **argvchar *argv[],那只会引起混乱。我最近看过一些示例,其中将main()定义为采用char *argv[argc+1]。这在现代C编译器中是允许的,但这不是C程序员习惯看到的。