如果我有这两种结构:
struct
{
int x;
} A;
struct
{
int x;
} B;
然后使A = B;
导致编译错误,因为两个匿名结构不兼容。
但是,如果我这样做:
typedef struct
{
int x;
} S;
S A;
S B;
A = B;
是合法的转让,因为它们兼容。
但为什么呢?使用typedef
我理解编译器在遇到S A
和S B
时会这样做:
struct { int x; } A;
struct { int x; } B;
因此A
和B
不应兼容...
答案 0 :(得分:15)
每个匿名结构声明都是一个不同的类型;这就是为什么在尝试将一个类型分配给另一个时会出现类型不匹配的原因。
然而,typedef为类型声明了一个别名(即已经存在的东西的新名称)(它不会创建新类型)。
typedef也是不一个简单的文本替换,就像预处理器宏一样。你的陈述
我理解编译器在遇到
时会这样做S A
和S B
:struct { int x; } A; struct { int x; } B;
是你理解错误的地方。
使用类型别名S
时,如
S A;
S B;
根据定义,两个对象A
和B
的类型是相同的,并且可以将一个对象分配给另一个。
答案 1 :(得分:3)
这是因为C将每个未标记的struct
视为一种新的struct
,无论内存布局如何。但是,如果要在链接列表中使用typedef struct { } name;
,则无法使用struct
。在这种情况下,您需要坚持定义结构标记,而typedef
则标记为struct
。
答案 2 :(得分:2)
struct DistanceInMeter /* Anonymous 1 */
{
int x; /* distance */
};
struct VolumeInCC /* Anonymous 2 */
{
int x; /* volume */
};
struct DistanceInMeter A;
struct VolumeInCC B;
...
A = B; /* Something is wrong here */
等同于不同的类型并不总是有意义,因此是不允许的。
typedef struct DistanceInMeter /* Anonymous 1 */
{
int x; /* distance */
} Dist_t;
Dist_t C, D;
...
C = D; /* Alright, makes sense */