“struct foo *”和“foo *”之间的区别,其中foo是一个结构?

时间:2009-01-09 12:13:20

标签: c struct typedef

在C中,如果foo是结构,那么在编写“struct foo”而不仅仅是“foo”之间是否有区别?

例如:

struct sockaddr_in sin;
struct sockaddr *sa;

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

谢谢/ Erik

4 个答案:

答案 0 :(得分:11)

事实上,在标准“C”中,需要指定struct关键字。这在C ++中是可选的。

这就是有些人定义这样的结构的原因:

typedef struct foo { ... } bar;

可以使用bar代替struct foo。但是,某些C编译器不会强制执行此规则。

答案 1 :(得分:6)

是。在C(而不是C ++)中,结构体位于它们自己的命名空间中。所以如果你定义了一个

struct sockaddr { ... }

您不能将其用作

sockaddr s;
sockaddr *ps;

为了使其合法,您可以使用typedef导入类型名称的非结构名称空间:

typedef struct sockaddr { ... } sockaddr;
sockaddr s, *p;

答案 2 :(得分:0)

如果你输入它,你可以只使用“foo”。

答案 3 :(得分:0)

这取决于结构的定义方式。如果使用typedef定义它,则不必将stuct关键字放在前面。

typedef struct 
{
//
} aStruct;

aStruct abc;

但如果它不是typedef,则需要struct关键字。

struct aStruct
{
//
} ;

struct aStruct abc;