Если тип структуры определен в другом файле .c, он становится неполным?
Он становится неполным типом, если его определение не отображается в текущей единице перевода, где требуется его определение, например, при использовании его в операторе sizeof
.
В единице перевода, содержащей этот код
#include <stdio.h>
int main()
{
printf("%lu\n",sizeof(struct foo));
}
struct foo
не определено.
Так что естественно, что компилятор выдаст ошибку, что там используется неполный тип.
Вы должны поместить определение структуры в заголовок, если оно используется более чем в одной единице перевода.
Или, если вам нужно знать только размер структуры и она больше нигде не используется, то вы можете просто написать
#include <stdio.h>
int main()
{
printf("%zu\n",sizeof(struct foo { void * data; } ));
}
Обратите внимание, что в приведенной выше программе тип struct foo
определяется в области видимости блока main.
EDIT: После того, как вы обновили свой вопрос, затем в этой единице перевода
#include <stdio.h>
#include "b.h"
int main()
{
printf("%lu\n",sizeof(struct foo));
}
у вас неполное объявление структуры в заголовке b.h
(где вы забыли поставить точку с запятой после объявления)
struct foo;
^^^
Таким образом, фактически ничего не изменилось по сравнению с предыдущей демонстрационной программой, за исключением того, что теперь объявление структуры имеет файловую область, а не блочную, как это имело место в предыдущей программе. Компилятор не может определить размер структуры, не имея ее определения
Обратите внимание на то, что в этой команде
$gcc a.c b.c
файлы a.c
и b.c
компилируются отдельно.
person
Vlad from Moscow
schedule
20.08.2020
a.c
как компилятор узнает, что такоеstruct foo
? Для этого и нужны заголовочные файлы. - person stark   schedule 20.08.2020struct foo;
(у вас отсутствует точка с запятой) называется предварительным объявлением. Он говорит, что этот тип существует, но не определяет его. - person stark   schedule 20.08.2020