Каково определение неполного типа и типа объекта в C? - PullRequest
4 голосов
/ 12 октября 2010

Каково определение Неполный тип и Тип объекта в C?Кроме того, не могли бы вы привести примеры каждого из них?

В ANSI C99 упоминаются обе категории типов в разных местах, хотя мне было трудно понять, что конкретно означает каждая из них (нет абзаца / предложения, явно определяющегочто они есть).

Ответы [ 2 ]

6 голосов
/ 12 октября 2010

Перейдем к онлайн-стандарту C (черновик n1256) :

6.2.5 Типы

1 Значение сохраненного значенияв объекте или возвращаемом функцией определяется типом выражения, используемого для доступа к нему.(Идентификатор, объявленный как объект, является самым простым таким выражением; тип указан в объявлении идентификатора.) Типы разбиты на типы объектов (типы, которые полностью описывают объекты), функция типы (типы, которые описывают функции) и неполные типы (типы, которые описывают объекты, но не имеют информации, необходимой для определения их размеров).

Примеры неполные типы:

struct f;    // introduces struct f tag, but no struct definition
int a[];     // introduces a as an array but with no defined size

Вы не можете создавать экземпляры неполных типов, но вы можете создавать указатели и имена typedef из неполных типов:

struct f *foo;
typedef struct f Ftype;

Чтобы включить неполныеТип структуры в тип объекта, мы должны определить структуру:

struct f
{
  int x;
  char *y;
};
0 голосов
/ 12 октября 2010

Типы, о которых я знаю:

  • Неполный тип
  • тип объекта
  • тип функции

Вот пример (также на кодовой панели: http://codepad.org/bzovTRmz)

#include <stddef.h>

int main(void) {
    int i;
    struct incomplete *p1;
    int *p2;
    int (*p3)(void);

    p1 = NULL; /* p1 is a pointer to a incomplete type */
    p2 = &i;   /* p2 is a pointer to an object */
    p3 = main; /* p3 is a pointer to a function */

    return 0;
}

struct incomplete может быть определен (с определенным размером) в другой единице перевода. Эта единица перевода нуждается только в указателе, хотя

...