【发布时间】:2008-10-10 05:06:55
【问题描述】:
我经常在 C++ 中使用execv() 函数,但如果某些参数是 C++ 字符串,我会因为不能这样做而烦恼:
const char *args[4];
args[0] = "/usr/bin/whatever";
args[1] = filename.c_str();
args[2] = someparameter.c_str();
args[3] = 0;
execv(args[0], args);
这不会编译,因为execv() 采用与const char * 不兼容的char *const argv[],所以我必须使用strdup() 将我的std::strings 复制到字符数组中,这很痛苦。
有人知道这是什么原因吗?
【问题讨论】:
-
如果你确定你执行的程序不会改变它的参数,我认为你可以安全地使用 const_cast。 execv() 的实现没有。
-
我一直在为我所做的每个系统调用编写 C++ 包装器,因此系统调用会引发异常,而我不必检查返回值。作为其中的一部分,我刚刚创建了一组重载,它们为我完成了所有
const_casting,因此我不必将它们洒在整个代码中。您需要 execve 的定义才能工作,因为这两个参数都是 const/non-const。其中之一当然是系统定义。其他的只是内联函数,在给定适当的演员表的情况下转发给那个。