Да, это можно сделать довольно чисто, используя преимущества внутреннего массива, который используют векторы.
Это будет работать, поскольку стандарт гарантирует, что его элементы хранятся непрерывно (см. 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, чтобы избежать "устаревшего преобразования из строковой константы в 'char *'". Строковые литералы реализованы как "const char *" в C ++. Const_cast является самой безопасной формой приведения здесь, поскольку она только удаляетconst и не делает никаких других забавных дел. execvp не будет редактировать значения в любом случае.
Если вы хотите избежать всех приведений, вам придется усложнить этот код, скопировав все значения в типы 'char *'не очень стоит.