2

目前我正在开发一个 iOS 应用程序,其中我使用结构来存储一些数据。

我声明了一个结构,如:

typedef struct Message
{
    int    messageType;
    char   *data;
    int    length;
} Message;

但是当我需要声明一个变量时,我不小心写了如下:

struct Message *myMessage = NULL;

这工作正常,没有问题。

我的问题是为什么这条线没有显示任何问题?

两个都 :

struct Message *myMessage = NULL;

Message *myMessage = NULL;

正常工作。这是正确的行为typedef吗?为什么我使用时它不会显示任何错误struct Message

4

5 回答 5

8

是的,这是正确的。

关键字后面的名称,称为“结构标签”,与别名struct不在同一个“名称空间”中。typedef这就是为什么它们不会发生碰撞并产生某种错误的原因。

也就是说,你应该从你的声明中删除标签,然后让它:

typedef struct
{
    int    messageType;
    char   *data;
    int    length;
} Message;

引入不需要的名字是没有意义的,这也可以保护你免受这种混淆,因为struct之前没有名字可以写。

于 2013-06-11T11:14:13.933 回答
4

是的,这是意料之中的。 struct Message是一种类型,并且您的 typedef 已创建Message为它的别名。声明变量时可以使用其中之一。

于 2013-06-11T11:13:55.820 回答
2

上面将两者struct Message及其“别名”声明为Message. 两者都很好。

于 2013-06-11T11:14:16.213 回答
2

这是 的正确行为typedef

于 2013-06-11T11:15:39.270 回答
0

可能这就是为什么,正如我上面所说的,我们被建议遵循 typedef 的命名约定。

struct Message {  
    int messageType;  
    char *data;  
    int length;  
}Message_t;  

以上是struct用他们的typedef. 在嵌入式中,您通常会发现它是Message_Type.

于 2013-06-11T13:39:51.960 回答