В дальнейшем я использую struct tag против идентификатора типа . Я немного погуглил и нашел (ИМХО) довольно простое объяснение в Википедии .
Некоторые программисты, чувак, упоминали об этом, но, похоже, вы не поняли его точку зрения. Итак, я немного уточню это:
Это действительно:
struct Node {
struct Node *pNext;
};
и может использоваться с struct
:
void insert_after(struct Node *pNode);
Для тех, кому лень набирать struct
, всегда может помочь typedef
:
struct Node {
struct Node *pNext;
};
typedef struct Node Node;
Может показаться странным, но компилятор разделяет теги и типы struct
в отдельные списки. Таким образом, первый и второй Node
не имеют идентификатора "столкновения".
И то, и другое можно сделать одновременно:
typedef struct Node {
struct Node *pNext;
} Node;
Если предположить другой случай без «рекурсивного» использования типа, тег struct
можно даже опустить:
typedef struct {
int year, month, day;
} Date;
Это тип struct
, который может использоваться исключительно без ключевого слова struct
.
Я предполагаю, что это было предназначено при написании
typedef struct record_t;
но компилятор интерпретирует это не так, как это может сделать автор. Компилятор читает это как struct
с тегом record_t
и идентификатором пропущенного типа.
Вот как я читаю
warning: useless storage class specifier in empty declaration
(Полезно знать, что typedef
синтаксически обрабатывается в компиляторе, как static
и extern
и, таким образом, считается классом хранения, хотя это не всем очевидно.)
Я должен признать, что не знаю, как интерпретировать
error: expected declaration specifiers or '...' before 'record_t'
но я бы проигнорировал это и просто исправил бы слабость в typedef
(и посчитал бы ошибку последующей ошибкой).
Я также должен признать, что не знаю, как решить эту проблему с помощью анонимного struct
и согласиться с идеей struct
с тегом, который «повторно используется» в качестве идентификатора типа:
#include <stdio.h>
/* typedef for an incomplete struct */
typedef struct Date Date;
/* use incomplete struct type for prototype of function */
void printDate(Date *pDate);
/* define the complete struct */
typedef struct Date {
int year, month, day;
} Date;
/* implementation of function */
void printDate(Date *pDate)
{
printf("%04d/%02d/%02d", pDate->year, pDate->month, pDate->day);
}
/* check this out */
int main(void)
{
Date date = { 2018, 9, 3 };
printDate(&date);
return 0;
}
Выход:
2018/09/03
Демонстрация в реальном времени на ideone