【发布时间】:2016-04-28 21:00:57
【问题描述】:
这是execv的原型:
int execv(const char *path, char *const argv[]);
我可以传递一个const char 指针数组作为第二个参数吗?
当USE_CAST 未设置时,此示例程序会发出警告:
#include <unistd.h>
int main(int argc, char *argv[])
{
if (argc > 0) {
const char *exe_name = "/bin/echo", *message = "You ran";
const char *exe_args[] = { exe_name, message, argv[0], NULL };
#ifdef USE_CAST
execv("/bin/echo", (char **) exe_args);
#else
execv("/bin/echo", exe_args);
#endif
}
return 0;
}
编译时,gcc 说,如果我不使用强制转换,“从不兼容的指针类型传递 'execv' 的参数 2”。
从POSIX documentation 到execv(在基本原理部分的一半)看来,第二个参数是一个char *const 数组,只是为了向后兼容:
包含关于
argv[]和envp[]是常量的声明是为了向未来的语言绑定编写者明确说明这些对象是完全常量。 ……可惜第四列不能用……
“第四列”指的是const char* const[]。
(char **) 演员在这里可以安全使用吗?我应该创建一个char * 数组并将其传递给execv 吗?
【问题讨论】:
标签: c exec posix constants const-correctness