C主函数const char*[]与char*[]的比较

jtoj6r0c  于 2022-12-11  发布在  其他
关注(0)|答案(2)|浏览(200)

我不明白这和你的

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

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

是。
我知道char*[]const char*[]之间的区别,但我想知道为什么要使用后者。
是否存在需要更改命令行参数的用例?添加const的最佳实践是什么?

vuktfyat

vuktfyat1#

根据C 2018 5.1.2.2.1 1,int main(int argc, char *argv[])是根据C标准为托管环境声明main的定义方式。int main(int argc, const char *argv[])不是。
最好在适当的地方使用const来指示指向的对象不会更改,但必须正确使用。类型char *[]const char *[]不兼容,不能作为参数声明或参数类型互换。如果main是用const char *argv[]声明的,则C标准未定义该行为。
至于为什么规定的声明是char *argv[]而不是const char *argv[],这部分是历史原因,部分是因为一些处理命令行参数的技术修改了相应的参数。

6rqinv9w

6rqinv9w2#

第一个(char** argv)由C11 standard定义:
它应使用int返回类型定义,且不带参数:

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

或者具有两个参数(这里称为argcargv,尽管可以使用任何名称,因为它们对于声明它们的函数是局部的):

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

或等效的¹)或以某种其他实现方式定义的方式来实现。
¹因此,int可以被一个typedef的名称替换,定义为int,或者argv的类型可以写成char ** argv,等等。
您可能会认为,在C11标准定义const char的方式上,const charchar“等效”。但是,该标准也对参数进行了说明:
参数argcargv以及argv数组指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其最后存储的值。
因此,const似乎***不是***C标准。
This回答详细说明了是否可以修改main参数。数组char **argv在运行时分配,修改它不会影响任何程序执行。
至于为什么const不被用作声明,这主要归结为历史惯例。This question's answers详细说明了为什么const char **argv可能被用来代替它的非const

相关问题