Typecast Void** в C

Я манипулирую параметром "структуры" таким образом, что могу разыменовать его и взять член из него, учитывая, что

typedef struct
{
    char Name[UI_NAME_SIZE];
    unsigned char IP[4];
    char Serial[20];
    unsigned short Type;
    unsigned short Method;
    unsigned short Group_Rule;
    char OldName[UI_NAME_SIZE];
    unsigned short Operation;
}UI_Remote_s;

а также

unsigned short UI_Write_StructFunction(UI_STRUCT_FUNC_s type, void **structs, unsigned short write_length)
{
    switch(type)
    {
        case UI_STRUCT_REMOTE_LIST:
        {
            a1 = (UI_Remote_s*)structs->Method;         //compiler error
            a2 = ((UI_Remote_s*)structs)->Method;       //correct

            break;
        }
        case UI_STRUCT_DSP_ETH_DNM_SD_INFO:
        {

            break;
        }
    }
    return 0;
}

В соответствии с приоритетом, сначала берется (), а затем ->. Он должен правильно работать без внешних скобок, но это неправильно.

Зачем? Спасибо

1 ответ

Решение

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

UI_Remote_s **ptr = (UI_Remote_s **)structs;
a2 = (*ptr) -> Method;
a2 = (*(ptr + 5)) -> Method;
a2 = ptr[2] -> Method;
.....
Другие вопросы по тегам