Почему я могу использовать указатель типа структуры перед делами - PullRequest
1 голос
/ 26 марта 2020

Почему я могу скомпилировать приведенный ниже код без какого-либо объявления?

struct node *n;

int main()
{
  return 0;
}

Я не включил заголовок. Это нормально?

1 Ответ

2 голосов
/ 26 марта 2020

Определение указателя действует как предварительное объявление из struct node. Использование такого объявления допускается до тех пор, пока указатель не разыменовывается до появления фактического определения структуры.

Это необходимо для того, чтобы разрешить такие конструкции:

struct list_node {
    int value;
    struct list_node *next;
};

Это типичное определение узла в связанном списке. Поле next имеет тип struct list_node *, но на данный момент struct list_node еще не полностью определено. Если бы такие прямые объявления не были разрешены, такие конструкции были бы невозможны.

Вы также можете использовать такой указатель для передачи в функцию и получения возвращаемого значения. Например:

struct node *n = new_node();
set_node_value(n, 1);

Эти две функции могут быть определены в отдельном исходном файле, где известно полное определение struct node. Структура в этом случае - непрозрачный тип , который пользователям библиотеки не требуется знать детали.

...