我想将一个向量作为第二个参数传递给execvp。有可能吗?
答案 0 :(得分:7)
是的,通过利用矢量使用的内部数组,它可以非常干净地完成。
这样可行,因为标准保证其元素是连续存储的(参见https://stackoverflow.com/a/2923290/383983)
#include <vector>
using namespace std;
int main(void) {
vector<char *> commandVector;
// do a push_back for the command, then each of the arguments
commandVector.push_back("echo");
commandVector.push_back("testing");
commandVector.push_back("1");
commandVector.push_back("2");
commandVector.push_back("3");
// push NULL to the end of the vector (execvp expects NULL as last element)
commandVector.push_back(NULL);
// pass the vector's internal array to execvp
char **command = &commandVector[0];
int status = execvp(command[0], command);
return 0;
}
答案 1 :(得分:2)
不直接;你需要以某种方式将向量表示为以字符串形式的NULL终止数组。如果它是一个字符串向量,那么这很容易做到;如果是其他类型的数据,则必须计算如何将其编码为字符串。
答案 2 :(得分:0)
是的,通过利用矢量使用的内部数组,它可以非常干净地完成。
这样可行,因为标准保证其元素是连续存储的(参见https://stackoverflow.com/a/2923290/383983)
#include <vector>
using std::vector;
int main() {
vector<char*> commandVector;
// do a push_back for the command, then each of the arguments
commandVector.push_back(const_cast<char*>("echo"));
commandVector.push_back(const_cast<char*>("testing"));
commandVector.push_back(const_cast<char*>("1"));
commandVector.push_back(const_cast<char*>("2"));
commandVector.push_back(const_cast<char*>("3"));
// push NULL to the end of the vector (execvp expects NULL as last element)
commandVector.push_back(NULL);
int status = execvp(command[0], &command[0]);
return 0;
}
执行const_cast以避免从字符串常量转换为&#39; char *&#39;&#34;。字符串文字实现为&#39; const char *&#39;在C ++中。 const_cast是这里最安全的转换形式,因为它只删除了const而且没有做任何其他有趣的事情。 execvp无论如何都不会编辑这些值。
如果你想避免所有强制转换,你必须通过将所有值复制到&#39; char *&#39;来使这段代码复杂化。类型不值得。