这些 const 中的每一个是什么意思?

What does each of these `const`s mean?

通常人们这样写 main 函数:

int main( int argc, char** argv )

然而,我想到了这个:

int main( const int argc, const char* const* const argv )

或者我应该这样写,因为它看起来更直观:

int main( const int argc, const char *const *const argv )

argv中的每个const是什么意思(我想我都明白了,但还是不确定)?

这也是一个有效的代码吗?在main里面使用argv会导致什么issues/limitations?

现在这个和后者有什么区别:

int main( const int argc, const char* const argv[] )

原型定义为“int main( int argc, char** argv )

以后使用 const 指针访问参数真的没有意义,除非你不想改变它,这取决于你

const 指针的目的是确保它们在整个代码中不被更改。你可以没有它们,但它有助于避免其他问题,例如错误。

另一方面,没有性能提升(Optimizing_compiler)

1 程序启动时调用的函数名为main。该实现没有为此函数声明原型。它应定义为 return 类型的 int 并且没有参数:

int main(void) { /* ... */ }

或带有两个参数(此处称为 argc 和 argv,但可以使用任何名称,因为它们对于声明它们的函数而言是局部的):

int main(int argc, char *argv[]) { /* ... */ }

或等价物;9) 或其他 implementation-defined 方式。 2 如果声明了,main函数的参数应遵循以下

约束: — argc 的值应为非负数。 — argv[argc] 应为空指针。 — 如果 argc 的值大于零,则数组成员 argv[0] 到 argv[argc-1] 包括在内应包含指向字符串的指针,这些字符串在程序启动之前由主机环境赋予 implementation-defined 值。目的是向程序提供在程序启动之前从托管环境中的其他地方确定的信息。如果主机环境无法提供包含大写和小写字母的字符串,则实施应确保以小写形式接收字符串。

——如果argc的值大于0,argv[0]指向的字符串代表程序名;如果程序名称在主机环境中不可用,argv[0][0] 应为空字符。 如果argc的值大于1,argv1到argv[argc-1]指向的字符串代表程序参数

—参数argc和argv以及argv数组指向的字符串应该可以被程序修改,并且在程序启动和程序终止之间保持它们的last-stored值

所以,简而言之,添加 const 是非法的,并且在技术上可能是不可能的(取决于编译器)

检查标准,您会看到以下规则:(ISO/IEC 9899:TC3),转到 5.1.2.2.1