c++ - 可变字符数组在嵌套函数 C++ 中显示不正确
问题描述
我有两个用于 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
指向一个完全不同的内存位置,我得到一些像这样的垃圾:“\Ú±”
请注意,当我这样做时,我仍然在第一个函数中注释了同一行。
如何正确地将可变参数 char 数组或字符串传递给嵌套函数?
编辑:我知道这些不是技术上的嵌套函数,因为函数 2 没有在函数 1 中定义,我找不到更好的术语来使用它
谢谢,
解决方案
这是不正确的
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>
而不是处理可变参数。
推荐阅读
- r - R:如何计算一个有长度条件的纵向数据库中连续出现的次数?
- c# - ExecuteSqlCommand 在@p0 附近抛出不正确的语法,但在 ssms 中它成功执行
- reactjs - React 循环遍历状态变量在渲染最终值之前所具有的每个值
- javascript - 针对多个条件改进我的数组搜索
- python - 不能在 python 3 中使用 librosa
- sorting - Kotlin 在 Map 上自定义排序
- visual-studio - packages.config 是否必须在项目文件夹中?
- react-native - 点击状态栏时将 FlatList 滚动到顶部
- javascript - jQuery scrollTop 动画怪异且无法控制的缓动
- julia - 进度条减慢循环