main-C 不是 const 的原因
Reason main-C isn't const
我看到 main()
函数通常称为:
int main(int argc, char** argv)
int main(int argc, char* argv[])
int main(void)
与这些定义相关:
- 从技术上讲,
char** argv
和 char* argv[]
是一个优于另一个的首选还是它们 100% 可以互换?
- 因为
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.
- 它们完全可以互换。
- 修改它们是有效的,有时程序中有一个命令行处理器链,每个处理器都会删除与其相关的选项,然后再将其传递给链中的下一个处理器。在这种情况下,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 **argv
或 char *argv[]
,只会引起混乱。我最近看到 main()
被定义为采用 char *argv[argc+1]
的示例。这对于现代 C 编译器是允许的,但这不是 C 程序员习惯看到的东西。
我看到 main()
函数通常称为:
int main(int argc, char** argv)
int main(int argc, char* argv[])
int main(void)
与这些定义相关:
- 从技术上讲,
char** argv
和char* argv[]
是一个优于另一个的首选还是它们 100% 可以互换? - 因为
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.
- 它们完全可以互换。
- 修改它们是有效的,有时程序中有一个命令行处理器链,每个处理器都会删除与其相关的选项,然后再将其传递给链中的下一个处理器。在这种情况下,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 **argv
或 char *argv[]
,只会引起混乱。我最近看到 main()
被定义为采用 char *argv[argc+1]
的示例。这对于现代 C 编译器是允许的,但这不是 C 程序员习惯看到的东西。