【问题标题】:Why are execv*() arguments inconsistent with execl*()?为什么 execv*() 参数与 execl*() 不一致?
【发布时间】:2015-01-29 18:40:52
【问题描述】:

为什么 execv*() 系列函数的 argv 参数是 char * const [] 而 execl*() 系列 arg0...n 参数是 const char *?这只是标准中的一个错误,应该是const char * const [] 还是有理由让字符串在数组情况下是非常量但在显式传递的参数情况下是常量?

   int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
   int execv(const char *path, char *const argv[]);
   int execle(const char *path, const char *arg0, ... /*,
          (char *)0, char *const envp[]*/);
   int execve(const char *path, char *const argv[], char *const envp[]);
   int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);
   int execvp(const char *file, char *const argv[]);

【问题讨论】:

    标签: c exec standards argv


    【解决方案1】:

    我找不到权威答案,但我怀疑这两个调用签名因创建方式和使用方式而异。

    在execl*() 的情况下,您的函数完全有可能被传递给您正在传递的const char*。如果execl*() 的签名不是const char*,那么您会收到编译器警告。

    在execv*() 的情况下,由于它可能是由您构建的数组,因此保持字符串值的恒定性并不那么重要。但重要的是 execv*() 不能操纵指针——否则最后一个元素可能会被修改,因此它不再正确指向 NULL——这是必需的。

    也许更熟悉规范的人来澄清我可能出错的地方。

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 2020-07-25
      • 2018-05-26
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      相关资源
      最近更新 更多