繁体   English   中英

为什么`execvp`采用`char * const argv []`?

[英]Why does `execvp` take a `char *const argv[]`?

我想知道两个exec函数之间是否存在const -ness不同的原因,如果这只是Single Unix Spec中的一个错误:

摘自Linux手册页,它似乎与Single Unix Specification一致 ,这里有两个版本的exec

int execlp(const char * file , const char * arg , ...);
int execvp(const char *
file , char *const argv []);

execlp将其参数作为const char * ,它需要两个或多个。 C中的const是一个承诺,该函数不会更改指向的数据,在这种情况下,构成字符串的实际字符( char )。

execvp将其参数作为指针数组。 然而,正如您所期望的那样, const关键字位于不同的位置而不是指向const char *的指针数组 - 这对于C. execvp来说很重要,因为它可能会很好地修改字符串中的字符,但是它承诺不修改数组 - 即指向字符串的指针。 所以,换句话说,

int fake_execvp(const char *file, char *const argv[]) {
    argv[0] = "some other string"; /* this is an error */
    argv[0][0] = 'f';              /* change first letter to 'f': this is perfectly OK! */
    /* ⋮ */
}

特别是,这使得使用C ++的std::stringto_cstr()方法调用execvp变得很困难(技术上是禁止的),该方法返回const char *

似乎execvp真的应该采用const char *const argv[] ,换句话说,它应该保证不做上述任何一种改变。

引用您链接的页面:

关于argv[]envp[]作为常量的声明是为了使未来的语言绑定编写者明确表示这些对象是完全不变的。 由于ISO C标准的限制,不可能在标准C中陈述该想法。为exec函数指定argv[]envp[]参数的两个const级别可能似乎是自然的选择鉴于这些函数不修改指针数组或函数指向的字符,但这将禁止现有的正确代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM