C main function const char*[] vs char*[]



我不明白之间有什么区别

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

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

是。

我知道char*[]const char*[]之间的区别,但我想知道为什么要使用后者。

是否存在希望更改命令行参数的用例?添加const的最佳做法是什么?

int main(int argc, char *argv[])是根据C标准为托管环境声明main的一种定义方式,符合C 2018 5.1.2.2.1 1。int main(int argc, const char *argv[])不是。

在适用的情况下,最好使用const来指示指向的对象不会更改,但必须适当使用它。类型char *[]const char *[]不兼容,不能作为参数声明或参数类型互换。如果main是用const char *argv[]声明的,则行为不是由C标准定义的。

至于为什么指定的声明是char *argv[]而不是const char *argv[],这部分是历史性的,部分是因为一些处理命令行参数的技术会在适当的位置修改参数。

第一个(char** argv)由C11标准定义:

应使用int的返回类型进行定义,并且不带任何参数:

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

或者有两个参数(这里称为argcargv,但可以使用任何名称,因为它们是声明它们的函数的本地名称):

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

或同等产品⁰)或者以某种其他实施方式定义的方式。

cco⁰因此,int可以被定义为inttypedef名称取代,或者argv的类型可以被写为char ** argv,依此类推

你可以说const char是";等效";以C11标准定义char的方式。然而,该标准也对参数进行了说明:

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

所以const似乎是而不是C标准。

此答案详细说明是否可以修改main参数。数组char **argv是在运行时分配的,修改它不会影响任何程序的执行。

至于为什么const没有被用作声明,主要归结为历史实践。这个问题的答案详细说明了为什么使用const char **argv而不是非const

最新更新