【问题标题】:Why does `execvp` take a `char *const argv[]`?为什么`execvp`需要`char *const argv[]`?
【发布时间】: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::stringto_cstr() 方法调用 execvp 变得困难(从技术上讲,被禁止),该方法返回 const char *

看来execvp 真的应该接受const char *const argv[],也就是说,它应该承诺不做上述任何一项更改。

【问题讨论】:

  • 如果它已经有一个接受的答案,为什么它会被迁移??
  • 因为它属于这里。

标签: c exec api


【解决方案1】:

引用您链接的页面:

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

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

【讨论】:

  • (编辑:忽略这一点。我的观点已经在this question 中直接讨论过)。 链接页面1 底部附近的表格非常令人惊讶我。我没有意识到在 C 中不可能用char * const * 初始化const char * const *。这在 C++ 中运行良好。我真的不明白为什么。为什么 C 会认为这两种类型不兼容?
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 2022-07-14
  • 1970-01-01
  • 2011-08-14
  • 2015-11-07
  • 2018-01-06
  • 2018-03-27
相关资源
最近更新 更多