Почему можно использовать undefined struct в c
#include <stdio.h>
int main()
{
printf("%d", sizeof(struct token *));
}
Вышеприведенный код может быть скомпилирован и связан с использованием gcc под Linux. Может ли кто-нибудь из вас объяснить мне вещи, стоящие за Сценами? Я знаю, что точка занимает фиксированный размер памяти, поэтому структура
токен не имеет отношения к sizeof, но даже включите опцию предупреждения в gcc, никаких предупреждений о структуре "none exist" вообще. Контекст вопроса заключается в том, что я читаю некоторый исходный код другими, я очень стараюсь найти определение "токен структуры", но не прошел курс.
Ответы
Ответ 1
Потому что вы пытаетесь получить размер указателя на struct token
. Размер указателя не зависит от того, как структура определена.
Как правило, вы можете даже объявить переменную типа struct token*
, но вы не можете разыменовать ее (например, получить доступ к элементу через указатель).
Ответ 2
Чтобы перефразировать стандарт C, неполным типом является тип, который описывает
но отсутствует информация, необходимая для определения ее размера.
void - еще один неполный тип. В отличие от других неполных типов, void не может
будет завершено.
Этот "неполный тип" часто используется для видов дескриптора: библиотека позволяет вам выделять "дескриптор" для чего-то, работать с ним и снова утилизировать. Все это происходит в библиотеке. Вы, как пользователь, не знаете, что может произойти внутри.
Пример:
lib.h:
struct data * d_generate(void);
void d_set(struct data *, int);
int d_get(struct data *);
void d_free(struct data*);
lib.c:
#include "lib.h"
#include <stdlib.h>
struct data { int value; };
struct data * d_generate(void) {
return malloc(sizeof(struct data))
}
void d_set(struct data * d, int v) {
d -> value = v;
}
int d_get(struct data * d) {
return d->value;
}
void d_free(struct data* d) {
free(d);
}
user.c:
#include "lib.h"
[...]
struct data * d = d_generate();
d_set(d, 42);
int v = d_get(d);
// but v = d->value; doesn't work here because of the incomplete definition.
d_free(d);