Разница между "struct foo *" и "foo *", где foo является структурой? - PullRequest
6 голосов
/ 09 января 2009

В C, есть ли разница между написанием "struct foo" вместо просто "foo", если foo является структурой?

Например:

struct sockaddr_in sin;
struct sockaddr *sa;

// Are these two lines equivalent?
sa = (struct sockaddr*)&sin;
sa = (sockaddr*)&sin;

Спасибо / Эрик

Ответы [ 4 ]

11 голосов
/ 09 января 2009

На самом деле, в стандартном "C" необходимо указать ключевое слово struct. Это необязательно в C ++.

Вот почему некоторые люди определяют структуры следующим образом:

typedef struct foo { ... } bar;

, чтобы иметь возможность использовать bar вместо struct foo. Однако некоторые компиляторы C не применяют это правило.

6 голосов
/ 09 января 2009

Да. В C (в отличие от C ++) структуры находятся в своем собственном пространстве имен. Так что, если вы определили

struct sockaddr { ... }

Вы не можете использовать его как

sockaddr s;
sockaddr *ps;

Чтобы сделать это допустимым, вы можете использовать typedef для импорта в неструктурное пространство имен имен типов:

typedef struct sockaddr { ... } sockaddr;
sockaddr s, *p;
0 голосов
/ 09 января 2009

Это зависит от того, как определяется структура. Если он определен с помощью typedef, вам не нужно помещать ключевое слово stuct впереди.

typedef struct 
{
//
} aStruct;

aStruct abc;

но если это не typedef, вам нужно ключевое слово struct.

struct aStruct
{
//
} ;

struct aStruct abc;
0 голосов
/ 09 января 2009

Вы можете использовать просто "foo", если вы его определили.

...