Что означает передача двух псевдонимов в `typedef struct`? - PullRequest
2 голосов
/ 24 июня 2019

Что означает *B в следующем коде? Я понимаю эту смесь между typedef и struct. Однако это *B странно.

typedef struct Something
{
...
}
A, *B;

Я видел несколько вопросов о смешении typedef с struct, но ни один из них не говорил об этом двойном определении.

Ответы [ 2 ]

3 голосов
/ 24 июня 2019

Это менее распространенный вариант использования ключевого слова typedef, который позволяет определять два или более псевдонимов типа в одной строке.Здесь говорится, что

  • создает псевдоним с именем A, который представляет собой struct, а
  • создает псевдоним с именем B, который представляет указатель на struct.

В этом смысле это похоже на запись чего-то вроде

int A, *B;

Здесь это объявляет целое число с именем A и указатель на целое число с именем B,Синтаксис, включающий *, работает очень похоже на то, что происходит в операторе typedef, за исключением того, что вместо введения переменных он вводит типы.

Другой способ убедиться в этом: это эквивалентно разрушению вещейза исключением двух отдельных операторов:

typedef struct {
   ...
} A;

typedef A* B;

Здесь первое говорит: «A теперь относится к этому типу struct, а B теперь относится к указателю на A».

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

Я часто видел этот тип определения в коде Microsoft:

typedef struct {
    int count;
    char buffer[128];
} BUFFER, *PBUFFER;

Это позволяет писать код, подобный этому:

void read_buffer(PBUFFER pBuffer) {
    // Do something with pBuffer
}

int main(void) {
    BUFFER buffer;

    read_buffer(&buffer);
    return 0;
}

Чтобы прямо ответить на ваш вопрос:вид typedef позволяет определять тип и указатель на тип в одном и том же месте кода.

...