我不明白这和你的
int main(int argc, char* argv[]){;}
和
int main(int argc, const char* argv[]){;}
是。我知道char*[]和const char*[]之间的区别,但我想知道为什么要使用后者。是否存在需要更改命令行参数的用例?添加const的最佳实践是什么?
char*[]
const char*[]
const
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[],这部分是历史原因,部分是因为一些处理命令行参数的技术修改了相应的参数。
int main(int argc, char *argv[])
main
int main(int argc, const char *argv[])
char *[]
const char *[]
const char *argv[]
char *argv[]
6rqinv9w2#
第一个(char** argv)由C11 standard定义:它应使用int返回类型定义,且不带参数:
char** argv
int main(void) { /* ... */ }
或者具有两个参数(这里称为argc和argv,尽管可以使用任何名称,因为它们对于声明它们的函数是局部的):
argc
argv
int main(int argc, char *argv[]) { /* ... */ }`
或等效的¹)或以某种其他实现方式定义的方式来实现。¹因此,int可以被一个typedef的名称替换,定义为int,或者argv的类型可以写成char ** argv,等等。您可能会认为,在C11标准定义const char的方式上,const char与char“等效”。但是,该标准也对参数进行了说明:参数argc和argv以及argv数组指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其最后存储的值。因此,const似乎***不是***C标准。This回答详细说明了是否可以修改main参数。数组char **argv在运行时分配,修改它不会影响任何程序执行。至于为什么const不被用作声明,这主要归结为历史惯例。This question's answers详细说明了为什么const char **argv可能被用来代替它的非const。
int
typedef
char ** argv
const char
char
char **argv
const char **argv
2条答案
按热度按时间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[]
,这部分是历史原因,部分是因为一些处理命令行参数的技术修改了相应的参数。6rqinv9w2#
第一个(
char** argv
)由C11 standard定义:它应使用int返回类型定义,且不带参数:
或者具有两个参数(这里称为
argc
和argv
,尽管可以使用任何名称,因为它们对于声明它们的函数是局部的):或等效的¹)或以某种其他实现方式定义的方式来实现。
¹因此,
int
可以被一个typedef
的名称替换,定义为int
,或者argv
的类型可以写成char ** argv
,等等。您可能会认为,在C11标准定义
const char
的方式上,const char
与char
“等效”。但是,该标准也对参数进行了说明:参数
argc
和argv
以及argv
数组指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其最后存储的值。因此,
const
似乎***不是***C标准。This回答详细说明了是否可以修改
main
参数。数组char **argv
在运行时分配,修改它不会影响任何程序执行。至于为什么
const
不被用作声明,这主要归结为历史惯例。This question's answers详细说明了为什么const char **argv
可能被用来代替它的非const
。