对于Windows包装类,我有两个函数,我试图通过这些函数传递char *数组的可变参数列表
第一个是:
bool OsInterface::AddDropdown(std::string menu_item_name, RECT v_location, int num_entries, ...)
{
bool ret_val = true;
va_list v_args;
va_start(v_args, num_entries);
//char* item_name = va_arg(v_args, char*);
if (!windowCreator.AddDropdown(menu_item_name, v_location, num_entries, v_args))
ret_val = false;
va_end(v_args);
return ret_val;
}
第二个是
bool WindowCreator::AddDropdown(std::string drop_down_name, RECT v_location, int num_entries, ...)
{
va_list v_args;
va_start(v_args, num_entries);
std::vector<std::string> item_names;
for(int i = 0; i < num_entries; i++)
{
char* item_name = va_arg(v_args, char*);
item_names.push_back(item_name);
}
va_end(v_args);
//Unrelated code following
}
我这样称呼它:
if (!osInterface.AddDropdown("Menu_Dropdown", v_position, 1, "Item1"))
问题出在这里
当我在第一个函数中取消注释该行时:
char* item_name = va_arg(v_args, char*);
我可以看到item_name实际上是“ Item1”
但是,当我在第二个函数中执行相同的操作时,它item_name
指向一个完全不同的内存位置,并且我得到了一些类似的垃圾:“ \Ú±” < / p>
请注意,执行此操作时,我在第一个函数中仍有相同的行注释。
如何正确地将可变参数char数组或字符串传递给嵌套函数?
编辑:我了解这些并不是技术上嵌套的函数,因为函数2没有在函数1中定义,我找不到更好的术语来使用它
谢谢
答案 0 :(得分:2)
这是不正确的
bool WindowCreator::AddDropdown(std::string drop_down_name, RECT v_location,
int num_entries, ...) {
... va_start ...
... va_arg ...
... va_end ...
}
这是正确的
bool WindowCreator::AddDropdown(std::string drop_down_name, RECT v_location,
int num_entries, va_list v_args) {
// no va_start
... va_arg ...
// no va_end
}
话虽如此,请考虑丢下C行李并传递std::initializer_list<std::string>
而不是处理varargs。