15

我想知道两个 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 *,并且它需要两个或多个参数。const在 C 中是一个承诺,该函数不会更改指向的数据,在这种情况下char,构成字符串的实际字符 ()。

execvp而是将其参数作为指针数组。const char *然而,关键字不是你所期望的指针数组,而是const在不同的位置——这对 Cexecvp来说很重要。说它可能会修改字符串中的字符,但它承诺不会修改数组——即指向字符串的指针。所以,换句话说,

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[],换句话说,它应该承诺不做上述任何一项更改。

4

1 回答 1

9

要引用您链接的页面:

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

基本上,在它们对相应参数指定相同限制的意义上,const限定execlpexecvp完全兼容。

于 2013-10-21T17:49:06.270 回答