C / C ++ Inline приведение массива указателей (void **) - PullRequest
0 голосов
/ 25 октября 2019

Я использую библиотечную функцию, которая ожидает массив указателей (void**) в какой-то момент, она работает более или менее так.

void* args[] = { &var_a, &var_b, &var_c, ... };
someFunction(args);

После использования один раз, я хотел быВызовите ту же функцию еще раз, поэтому я создаю еще одну переменную, например:

void* args_2[] = { &var_d, &var_e, &var_f, ... };
someFunction(args_2);

И так далее ...

Я бы хотел найти способ recycle символ args, поэтому мне не нужно делать args_2, args_3, args_4 каждый раз, когда я его вызываю;но когда я пытаюсь переназначить его как:

args = { &var_d, &var_e, &var_f, ... };

, я получаю следующее:

error: assigning to an array from an initializer list

Я понимаю ошибку, но не знаю, как ее избежать или принудить эту вещьв предполагаемый массив типов указателей.

Я знаю, что это два разных языка, но я ищу решение, которое работает как на C, так и на C ++.

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

Зачем вообще использовать локальную переменную, если она нужна только один раз для вызова someFunction?

using args = void *[];

someFunction(args{&a, &b});
someFunction(args{&a, &b, &c});

В качестве альтернативы, C ++, если это немного больше с оберткой:

template <class... T>
decltype(auto) someFunction(T *... args) {
    void *args_[] { args... };
    return someFunction(args_);
}

someFunction(&a, &b);
someFunction(&a, &b, &c);
1 голос
/ 25 октября 2019

Вы можете использовать составные литералы, как показано ниже, с указателем на указатель.

void** args = (void *[]){ &var_a, &var_b, &var_c, ... };

args = (void *[]){ &var_d, &var_e, &var_f, ... };
...