【发布时间】:2013-10-30 14:02:24
【问题描述】:
我想知道const-ness 中两个 exec 函数之间是否存在不同的原因,或者这是否只是 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 char * 的指针数组不同,const 关键字位于不同的位置——这对 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::string 的 to_cstr() 方法调用 execvp 变得困难(从技术上讲,被禁止),该方法返回 const char *。
看来execvp 真的应该接受const char *const argv[],也就是说,它应该承诺不做上述任何一项更改。
【问题讨论】:
-
如果它已经有一个接受的答案,为什么它会被迁移??
-
因为它属于这里。