проблемы с typedef на C - PullRequest
       18

проблемы с typedef на C

2 голосов
/ 02 октября 2010

Я пишу ADT на C: У меня два файла date.c and date.h внутри date.c у меня есть:

typedef struct Date_t {
 int date;
 char* month;
 int year;

} Date;

внутри даты. У меня есть:

typedef Date pDate;

компилятор выдаёт мне ошибки:

..\checking.h:15: error: syntax error before "pDate"

Может кто-нибудь объяснить, что не так с моим typedef, заранее спасибо

EDIT:

с файлами все в порядке, проблема в том, что когда я меняю свою структуру на:

struct Date_t {
     int date;
     char* month;
     int year;

    };

и указатель на:

typedef struct Date_t* pDate;

программа работает отлично, поэтому хочу понять разницу

Ответы [ 5 ]

2 голосов
/ 02 октября 2010

Вы, вероятно, объявляете pDate как typedef для Date до того, как вы даже объявили Date (так как вы делаете pDate в заголовке).

Вы можете сделать:ваш .c файл.

Что касается вашего редактирования:

Вы объявляете структуру в typedef:

typedef struct Date_t* pDate;

Это работает, потому что вы объявляете structперед тем, как поместить pDate.

typedef /*see this struct here*/ struct /*huh?*/ Date_t* pDate;

В другом нет struct.

1 голос
/ 02 октября 2010

Предполагается, что вы включили файл date.h перед определением структуры Date.Проблема в том, что вы пытаетесь typedef тип, прежде чем он существует.Компилятор C обрабатывает файл сверху вниз.По сути, то, что вы говорите:

typedef Date pDate;

typedef struct Date_t {
 int date;
 char* month;
 int year;

} Date;

В точке первого typedef C не имеет представления, что такое Date и, следовательно, ошибка.Вам нужно поменять определения.

typedef struct Date_t {
 int date;
 char* month;
 int year;

} Date;

typedef Date pDate;
0 голосов
/ 02 октября 2010

Возможно, часть вашей путаницы связана со странностью в C (а не в C ++).С помощью этого объявления:

struct Date_t {...};

Вы создаете тип структуры, который для использования вы должны квалифицировать с struct:

struct Date_t date1; /* Valid. */
Date_t date2; /* Not valid */

Однако в C это распространенная идиома, чтобы исправить это с помощьюa typedef:

typedef struct {...} Date_t;

struct Date_t date1; /* invalid */
Date_t date2; /* Valid */

Это также распространенная идиома в C, чтобы делать и то и другое вместе, как это:

typedef struct _Date_t {...} Date_t;

struct _Date_t date1; /* Valid */
Date_t date2; /* Also valid */

И просто чтобы добавить к путанице, обычно добавляется указательtypedef тоже:

typedef struct _Date_t {...} Date_t, * DateP;

Действительно, это исторический артефакт, исправленный в C ++.

0 голосов
/ 02 октября 2010

Вы можете без проблем использовать указатели на неполные типы в C ( проблемы появляются позже )

struct Date; /* declaration of incomplete type */
typedef struct Date Date;
typedef Date *pDate;

pDate p;
p = NULL; /* ok, even when Date hasn't been defined */
p = malloc(sizeof *p); /* wrong! you cannot know the sizes of incomplete types */
0 голосов
/ 02 октября 2010

Если вы включаете date.h перед определением структуры в date.c, компилятор жалуется, потому что он не знает, на что ссылается «Date» в тот момент, когда вы говорите «typedef Date pDate».

...