typedef stuct с предварительным объявлением в C - PullRequest
6 голосов
/ 16 ноября 2011

У меня есть что-то вроде:

typedef struct Data DATA, *DATA_PTR;
typedef struct Units UNITS, *UNITS_PTR;

struct Data
{
    double miscData;
    UNITS units;
};

struct Units
{
    double x[2];
    double y[2];
    double z[2];
};

в моем project_typedef.h файле.

В другом файле у меня что-то вроде:

void fileInput(DATA_PTR data)
{
     //usual declarations and other things
     data->miscData = 0; //Works!
     data->units.x[0] = 5; //Doesn't work
     //etc...
}

Однако это не работает, поскольку единицы объявляются после данных в project_typedef.h (если я переключаю порядок, он работает) Ошибка, которую я получаю, «слева от .x должен иметь тип struct / union». Я думал, что предварительная декларация решит эту проблему. Почему нет?

Ответы [ 4 ]

11 голосов
/ 16 ноября 2011

Когда вы определяете Data, все члены должны быть полными типами.Поскольку UNITS не является полным типом на данный момент, это не работает.(Напротив, UNITS_PTR будет в порядке , поскольку указатели на неполные типы являются полными типами.)

Просто поместите определение Units выше определения Data, и вы должныотлично.

(Как уже заметил @cnicutar, вы также неправильно используете массив x.)

6 голосов
/ 16 ноября 2011

Форвардное объявление позволяет вам использовать его имя в контексте, где разрешен неполный тип.Объявление члена структуры не является одним из таких случаев, полное определение должно быть известно, поскольку оно вносит вклад в структуру структуры.

1 голос
/ 06 сентября 2013

для определения структуры вы всегда должны использовать полные типы для всех элементов в структуре ... но это не так с UNITS units в struct Data, который объявляет переменную с именем units типа struct Unitsкоторый никогда не объявляется перед структурой Data ... это отражает ошибку .. Вы должны поместить определение Units выше определения Data, и все будет работать нормально ..

и относительно прямого объявления этогоне работает, так как всякий раз, когда определена переменная структуры, компилятор сначала выделяет память, необходимую для структуры ( членам struct donot не выделяется память для них, если только они не связаны с переменной типа struct ..вот почему структурные переменные не могут быть инициализированы внутри структуры шаблона) ..:)

1 голос
/ 16 ноября 2011

Нет прототипа для структуры.Это потому, что компилятор должен знать размер структуры перед его использованием.Вы можете использовать указатель на структуру, потому что указатели имеют известный размер независимо от того, на какой тип они указывают.

...