c中的结构声明与标识符

时间:2015-07-17 10:11:40

标签: c struct typedef

我试着理解这个C代码:

typedef struct _IntElem *IntList;
typedef struct _IntElem { int head; IntList tail;} IntElem;

据我所知,它定义了递归类型list。但是我不明白它的声明方式。我理解的是第二行,我们定义了一个名为IntElem的结构,它由一个整数和一个IntList组成。但是这个宣言中的_IntElem是什么?

第一行是为列表分配内存吗?

2 个答案:

答案 0 :(得分:4)

  • 第一行

    r<- raster(nrows=10, ncols=10)
    r <- setValues(r, 1:ncell(r))
    plot(r)
    points(x=-50,y=20)
    points(x=-50,y=-90)
    
    
    coor1<- data.frame(Lat=-50,Lon=20)
    
    
    point1 <- SpatialPointsDataFrame(
      data.frame(coor1$Lon,coor1$Lat),
      data.frame('Landriano')
    )
    
    x11()
    plot(r)
    plot(point1, add=T)
    

只是为 typedef struct _IntElem *IntList; 创建typedef别名。别名名为struct _IntElem *。 FWIW,在这个时间点,编译器不需要知道IntList的定义。

  • 第二行

    struct _IntElem
    1. 实际上定义了一个用户定义的类型typedef struct _IntElem { int head; IntList tail;} IntElem; ,其中有两个成员,_IntElemheadinttailIntList ed更早)
    2. typedef类型为typedef

请注意:实际上没有为 type 创建任何变量(我不是在谈论成员变量,当然,它们是定义的一部分)。因此,没有分配内存。

所以,要明确

  

但是这个声明中的IntElem是什么?

_IntElem是用户定义数据类型的名称。但是,在某些情况下,它是可选的。例如,

_IntElem

既完美又合法,除了事实,在这种情况下,我们正在为未命名的数据类型创建别名typedef struct { char name [32]; int age; float salary;} employee;

答案 1 :(得分:1)

在C中,如果我们有:

struct X
{
     stuff....
};

然后X被称为 struct tag 。这意味着struct X是类型的名称。 X本身不是类型的名称。事实上,X本身就像任何其他未声明的标识符一样;此结构定义仅定义特定用法struct X

我们可能会说struct标签与其他标识符位于不同的名称空间中(不要与C ++名称空间混淆!)

有时人们不喜欢在任何地方输入struct X。因此,他们使用typedef(令人困惑的是,这意味着创建一个类型别名),以便创建一个名称类型的标识符:

typedef struct X SX;

表示SX是一种类型。但由于struct标签位于自己的命名空间中,您甚至可以编写:

typedef struct X X;

表示X本身与struct X引用的类型相同。

希望您了解您现在正在查看的代码。我认为写起来会更清楚:

struct IntElem
{
    int head;
    struct IntElem *tail;
};

添加了可选的保存类型:

typedef struct IntElem IntElem;

指针typedef是邪恶的,因此可以完全省略IntList。可能你可以保留它作为列表用户的 opaque类型,但你应该避免在列表实现过程中使用它。