Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么'execvp'接受'char*const argv[]`?_C_Exec_Api - Fatal编程技术网

为什么'execvp'接受'char*const argv[]`?

为什么'execvp'接受'char*const argv[]`?,c,exec,api,C,Exec,Api,我想知道两个exec函数在const-ness方面的不同是否有原因,如果这只是单个Unix规范中的一个bug: 摘自Linux手册页(看起来与一致),下面是两个版本的exec: int execlp(常量字符*文件,常量字符*参数,…) int execvp(const char*file,char*const argv[]) execlp将其参数设置为const char*,并使用两个或更多参数const承诺函数不会更改指向的数据,在本例中,是组成字符串的实际字符(char) execvp将其

我想知道两个exec函数在
const
-ness方面的不同是否有原因,如果这只是单个Unix规范中的一个bug:

摘自Linux手册页(看起来与一致),下面是两个版本的
exec

int execlp(常量字符*文件,常量字符*参数,…)
int execvp(const char*file,char*const argv[])
execlp
将其参数设置为
const char*
,并使用两个或更多参数const
承诺函数不会更改指向的数据,在本例中,是组成字符串的实际字符(
char

execvp
将其参数作为指针数组。然而,与您预期的指向
const char*
的指针数组不同,
const
关键字位于不同的位置,这对C非常重要。
execvp
表示它可以很好地修改字符串中的字符,但它承诺不会修改数组,即指向字符串的指针。那么换句话说,

int-fake_-execvp(常量字符*文件,字符*常量argv[]){
argv[0]=“其他字符串”/*这是一个错误*/
argv[0][0]=“f”;/*将第一个字母更改为“f”:这完全可以*/
/* ⋮ */
}
特别是,这使得使用C++的
std::string
调用execvp很困难(技术上是禁止的),因为它返回
const char*


似乎
execvp
真的应该采取
const char*const argv[]
,换句话说,它应该承诺不做上述任何一项更改。

引用您链接的页面:

关于
argv[]
envp[]
是常量的语句包含在 向未来的语言绑定编写者明确这些 对象是完全恒定的。由于ISO C的限制 标准,不可能在标准C中陈述这一想法。 为
argv[]
指定两个级别的
const
-限定
envp[]
exec函数的参数似乎是自然的 如果这些函数不修改 指针或函数指向的字符,但 将不允许存在正确的代码


基本上,
execlp
execvp
上的
const
限定完全兼容,因为它们在相应的参数上指定了相同的限制。

如果它已经有一个可接受的答案,为什么要迁移它?因为它属于这里。(编辑:忽略此点。我的观点已在中直接讨论过)这个链接页面底部的表对我来说是非常令人惊讶的。我在C中没有意识到,不可能用<代码> CAR*CONST**/CODE初始化<代码> const char *const */COD>。这在C++中很好。我真的不明白为什么。为什么C认为这两种类型不兼容?