Как правильно привести указатель void **? - PullRequest
0 голосов
/ 17 января 2019

Учитывая, что

void func(uint8_t type, void **structs)
{
    switch(type)
    {
        case 1:
            a1 = (UI_Remote_s*)structs->Method;         //expression must have pointer to struct
            a2 = ((UI_Remote_s*)structs)->Method;       //correct
        break;
    }
}

Первая попытка неверна. Почему?

1 Ответ

0 голосов
/ 17 января 2019

Я бы не использовал этот тип приведения типов, так как он делает код намного сложнее для чтения. Вместо этого используйте временную переменную для хранения указателя. Это сделает код более легким для чтения и понимания. Компилятор может оптимизировать его в сгенерированном коде.

UI_Remote_s **ptr = (UI_Remote_s **)structs;
a2 = (*ptr) -> Method;
a2 = (*(ptr + 5)) -> Method;
a2 = ptr[2] -> Method;
.....
...