Да, это можно сделать довольно просто, используя преимущества внутреннего массива, который используют векторы. Лучше не использовать строки C ++ в векторе, строковые литералы const_cast и string.c_str () для char *.
Это будет работать, поскольку стандарт гарантирует, что его элементы хранятся непрерывно (см. 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);
const int status = execvp(command[0], &command[0]);
return 0;
}
Сделайте const_cast, чтобы избежать "устаревшего преобразования из строковой константы в 'char *'". Строковые литералы реализованы как «const char *» в C ++. const_cast - это самая безопасная форма приведения здесь, поскольку она только удаляет const и не занимается другими забавными делами. execvp не будет редактировать значения в любом случае.
Если вы хотите избежать всех приведений, вам нужно усложнить этот код, скопировав все значения в типы 'char *', которые не стоят того.
Хотя, если число аргументов, которые вы хотите передать execv / execl, известно, это легче написать в C.