Variadic char массив неправильно отображается во вложенной функции C ++ - PullRequest
1 голос
/ 16 июня 2019

У меня есть две функции для класса-оболочки Windows, через который я пытаюсь передать список аргументов с переменным числом символов * массивы

Первая:

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*);

Я вижу, что имя_элемента на самом деле "Item1"

Однако, когда я делаю то же самое во второй функции, оно item_name указывает насовершенно другая область памяти, и я получаю некоторый мусор, подобный этому: "\ Ú ±"

Обратите внимание, что у меня все еще остается та же строка, закомментированная в первой функции, когда я делаю это.

Как правильно передать массив или строку char с переменным аргументом во вложенную функцию?

Редактировать: Я понимаю, что это не технически вложенные функции, поскольку функция 2 не определена в функции 1,Я не смог найти для него лучшего термина

Спасибо,

1 Ответ

2 голосов
/ 16 июня 2019

Это неверно

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
}

См. vprintf и друзья .

Сказав это, рассмотрите возможность удалениябагаж C и прохождение std::initializer_list<std::string> вместо обращения с varargs.

...