为什么execv*()参数与execl*()不一致?

Wil*_*mKF 5 c standards exec argv

为什么函数族的argv论证而args 族呢?这只是标准中的一个错误,它应该是或者是否有理由在字符串情况下字符串是非const而在显式传递的参数情况下是const?execv*()char * const []execl*()arg0...nconst 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[]);
Run Code Online (Sandbox Code Playgroud)

use*_*028 0

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

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

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

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