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

5
为什么`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[]);
1个回答

0

我找不到权威的答案,但我怀疑这两个调用签名的区别取决于它们是如何创建和使用的。

execl*()的情况下,你的函数很可能会传递一个const char*,而你正在传递它。如果execl*()的签名不是const char*,那么你将会得到编译器警告。

execv*()的情况下,由于它是由你构建的数组,因此维护字符串值的常量性并不重要。但是,重要的是execv*()不能操作指针,否则最后一个元素可能会被修改,导致它不再正确地指向NULL,这是必需的。

也许有更熟悉规范的人可以澄清我可能犯的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接