Возможно, часть вашей путаницы связана со странностью в 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 ++.