Неопределенное имя структуры может использоваться для объявления новой переменной структуры - PullRequest
0 голосов
/ 26 июня 2018

У меня нет определения struct a, однако я могу объявить переменную с помощью struct a.Следующий код может быть скомпилирован в Linux с помощью GCC, так что же входит в struct a?a просто распознается как char *?Я не знаю, что это значит.

void main() {
    struct a *a1;
    a1 = 0;
}

1 Ответ

0 голосов
/ 26 июня 2018
struct a *a1;

объявляет a1 указателем на struct a. Вы можете юридически объявить указатель неполному struct типу a, потому что компилятору не нужно знать определение struct a для создания указателя на него. Все указатели на struct типы имеют одинаковые требования к представлению памяти и выравниванию, и это все, что нужно знать компилятору для его создания. Ваше назначение:

a1 = 0;

просто устанавливает указатель в 0, т. Е. Делает его нулевым указателем. Ничего не предполагает о типе объекта, на который может указывать указатель. Если бы вместо этого вы были попытаться что-то вроде:

a1->member = 0;

, что потребует от компилятора определения struct a, а вы увидит сбой компиляции как:

main.c:3:7: error: dereferencing pointer to incomplete type ‘struct a’
     a1->member = 0;
       ^

Позже

Где мне нужно использовать этот синтаксис? Обычно для чего используется неопределенная структура?

Классическое использование неполных указателей struct заключается в реализации абстрактного типа данных. в C. C API, предоставляемый через заголовочный файл, определяется в терминах «непрозрачных» struct указателей - указатели на неполные типы - так что клиент может запросить и манипулировать объектами, адресованными этими указателями, только через API и не может обойти это, чтобы обрабатывать объекты неутвержденными способами, потому что они не могут видеть определения типов данных, на которые указывают непрозрачные указатели! Вот элементарный пример из C FAQ

...