Важно отметить, что C имеет несколько пространств имен. Общее пространство имен
включает в себя typedefs и другие идентификаторы, но есть отдельное пространство имен для
теги структуры, перечисления и объединения; еще один для меток, а также для каждой структуры
имеет свое собственное пространство имен. В коде так:
struct name {
int name;
} name;
name
означает 3 совершенно разные вещи, и это совершенно законно. к
избегая ввода ключевого слова struct
, программисты часто вводят новое имя для
структура и ее тег:
typedef struct name {
int name;
} my_struct;
my_struct s1; /* easier than: struct name s1 */
my_struct s2;
В этом последнем примере имя может быть даже опущено, если вы не хотите использовать
указатель на структуру внутри себя. Эта практика была настолько распространена, что в C ++
компилятор считает тег определенного типа для структур. Это прекрасно
законно в C ++:
struct my_struct {
int name;
};
my_struct s1;
my_struct s2;
И действительно, это то, что происходит в вашей программе. Вы используете тег struct как
тип, но это только допустимый тип в C ++. У вас есть две альтернативы:
1. Введите структуру в ее объявлении
typedef struct in_addr {
/* ... */
} in_addr;
2. Используйте ключевое слово struct
для ссылки на тип структуры
(struct in_addr *)
Первый не применим, так как вы не объявили структуру. Это
уже идет таким путем. Так что я бы придерживался второго.