Рассмотрим файл заголовка foo.h, который содержит:Почему существование типа возврата предотвращает необходимость прямого объявления для параметра?
struct wl_display;
struct wl_array * bar(struct wl_display *display);
и файл реализации foo.c, который содержит полное определение wl_display
и реализацию bar
:
struct wl_display {
int baz;
};
struct wl_array * bar(struct wl_display *display) {
// ...
}
Если я удалю форвардную декларацию struct wl_display
, от foo.h, gcc Компилятор:
- Испустите предупреждение о том, что возникновение
struct wl_display *display
в списке параметров находится в блоке области действия (предупреждение: «структура wl_display» объявлена внутри списка параметров и предупреждение: сфера его применения только это определение или объявление, которое, вероятно, не то, что вы хотите). - Исправить ошибку: конфликтующие типы для «бара» бар (структура wl_display * дисплей).
Однако, если я затем добавить функцию, которая использует STRUCT wl_display * в качестве возвращаемого типа, так что foo.h содержит:
// struct wl_display;
struct wl_display * foo(void);
struct wl_array * bar(struct wl_display *display);
Все компилируется.
Почему использование struct wl_display*
в качестве типа возврата устраняет необходимость в прямом объявлении? Что такое «конфликт», который вызывает ошибку № 2 выше, поскольку тип параметра является только указателем, а сигнатуры функций идентичны?
Возможно, потому что объявление функции находится в области файлов? Список параметров является локальным для функции? –
'struct wl_display;' определяет * неполный тип *. который здесь используется как * непрозрачный тип *. – wildplasser