我不明白之间有什么区别
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) { /* ... */ }
或者有两个参数(这里称为
argc
和argv
,但可以使用任何名称,因为它们是声明它们的函数的本地名称):int main(int argc, char *argv[]) { /* ... */ }`
或同等产品⁰)或者以某种其他实施方式定义的方式。
cco⁰因此,
int
可以被定义为int
的typedef
名称取代,或者argv
的类型可以被写为char ** argv
,依此类推
你可以说const char
是";等效";以C11标准定义char
的方式。然而,该标准也对参数进行了说明:
参数
argc
和argv
以及argv
数组指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其上次存储的值。
所以const
似乎是而不是C标准。
此答案详细说明是否可以修改main
参数。数组char **argv
是在运行时分配的,修改它不会影响任何程序的执行。
至于为什么const
没有被用作声明,主要归结为历史实践。这个问题的答案详细说明了为什么使用const char **argv
而不是非const
。