我正在尝试制作char *argv[]
的副本,以便我可以将它们传递给需要char**
的函数。首先,我必须从原始argv
中删除一些标记:
int main(int argc, char* argv[]) {
::MessageBox(0,"Stopped at the entry point",0,0);
std::string inChannelParam = "--ipc-in-channel";
std::string outChannelParam = "--ipc-out-channel";
std::string inChannelName;
std::string outChannelName;
std::vector<std::string> argv_copy;
for(int i=0; i<argc; ++i) {
if(inChannelParam == argv[i]) {
if(++i < argc) {
inChannelName = argv[i];
continue;
}
} else if(outChannelParam == argv[i]) {
if(++i < argc) {
outChannelName = argv[i];
continue;
}
}
argv_copy.push_back(argv[i]);
}
std::vector<std::unique_ptr<char[]> > argv_copy_char;
for(int i=0;i<argv_copy.size();++i) {
argv_copy_char.push_back(std::unique_ptr<char[]>(new char[argv_copy[i].size()+1]));
memcpy(argv_copy_char[i].get(), &argv_copy[i][0], argv_copy[i].size());
argv_copy_char[i][argv_copy[i].size()] = '\0';
}
// what should i put here ?? --------------------vvv
v8::V8::SetFlagsFromCommandLine(&argc, &(argv_copy_char[0].get()), true);
我尝试了基于string和char []的方法。它给出了编译器错误:
error C2102: '&' requires l-value
使用&(argv_copy_char[0]._Myptr)
在
if (arg != NULL && *arg == '-') {
中的 flags.cc
。
函数SetFlagsFromCommandLine的签名是
SetFlagsFromCommandLine (int *argc, char **argv, bool remove_flags)
。
我该怎么办?
答案 0 :(得分:3)
您构建并填充了字符串向量:std::vector<std::string> argv_copy;
但是
我不明白为什么你决定使用这个向量来创建另一个包含unique_ptr<char[]>
类型元素的向量:
std::vector<std::unique_ptr<char[]> > argv_copy_char;
另请注意v8::V8::SetFlagsFromCommandLine
的原型是:
static void SetFlagsFromCommandLine (int *argc, char **argv, bool remove_flags)
...暴露向量的内部结构在这里不是很幸运,因为argv_copy
包含std::string
类型的对象......但API需要char**
,所以你是什么可以做的是动态分配并填充指向这些字符串的临时C风格指针数组:
// temporary C-style array
int myArgvSize = argv_copy.size();
char* myArgv[] = new char* [myArgvSize];
for (int i = 0; i < myArgvSize; ++i)
myArgv[i] = &argv_copy[i][0];
v8::V8::SetFlagsFromCommandLine(&myArgvSize, myArgv, true);
// cleanup:
delete[] myArgv;
请注意,此解决方案依赖于SetFlagsFromCommandLine
不会修改这些字符串长度的事实。
答案 1 :(得分:1)
为什么SetFlagsFromCommandLine
获得一个指向整数的指针?是否需要更改整数?我不明白为什么要传递一个指向它的指针。
问题似乎也在一个完全不同的地方,所以你分享的代码没什么用处
最后,看看你收到错误的那一行。检查:
arg
?它被定义了吗?arg
为空吗?arg
指针还是数组?答案 2 :(得分:1)
SetFlagsFromCommandLine
看起来像一个相当特殊的功能
对我来说,似乎期待argc
和argv
参数,修改它们(可能是通过删除选项)。
如果可能的话,我会首先使用argc
和
argv
,然后做我的特别处理。修改
可能会在argv
中以转移指针的形式发生
down,这意味着任何使用std::vector
的解决方案都会
调用函数后需要一些额外的处理。
如果您无法更改处理顺序(例如因为
--ipc-in-channel
及其参数可能会被提取出来
SetFlagsFromCommandLine
),那么你可能需要一些东西
如下所示(解析你的args之后):
std::vector<char*> tmp;
for ( auto current = argv_copy.begin();
current != argv_copy.end();
++ current ) {
tmp.push_back( current->empty ? "" : &(*current)[0] );
}
int argc_copy = tmp.size();
SetFlagsFromCommandLine( &argc_copy, &tmp[0] );
if ( argc_copy != argv_copy.size() ) {
auto dest = argv_copy.begin();
auto src = tmp.begin();
while ( dest != argv_copy.end() ) {
if ( (*src)[0] == '\0' ) {
if ( *dest != "" ) {
++ dest ;
} else {
while ( dest != argv_copy.end() && *dest != "") {
dest = argv.erase( dest );
}
}
} else {
if ( !dest->empty() && &(*dest)[0] == *src ) {
++ dest;
} else {
while( dest != argv_copy.end()
&& (dest->empty() || &(*dest)[0] != *src) ) {
dest = argv.erase( dest );
}
}
}
}
assert( argv_copy.size() == argc_copy );
}
这只是我的头脑,可能包含一些
错误,但它提供了如果你需要的努力
无法先拨打SetFlagsFromCommandLine
。
编辑:
或者,尽管有点痛苦,但你可以
以完全相同的方式处理argc
和argv
SetFlagsFromCommandLine
在内部执行,而不是放置它们
在std::vector
中:
int dest = 1;
int source = 1;
while ( source != argc ) {
if ( inChannelParam == argv[source] == 0 && source < argc - 1 ) {
inChannelName = argv[source + 1];
source += 2;
} else if ( outChannelPara == argv[source] == 0 && source < argc - 1 ) {
outChannelName = argv[source + 1];
source += 2;
} else {
argv[dest] = argv[source];
++ dest;
++ source;
}
}
argc = dest;
SetFlagsFromCommandLine( &argc, argv );
std::vector<std::string> argv_copy( argv, argv + argc );
与char**
等人打交道并不好玩,但是因为你需要
这种格式以后,它可能不像翻译那么痛苦
格式之间多次。