目前我正在开发一个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
时,为什么它不会显示任何错误?
答案 0 :(得分:8)
是的,这是正确的。
关键字struct
后面的名称(称为“struct tag”)与typedef
别名不在同一“名称空间”中。这就是为什么他们没有碰撞并产生某种错误。
那就是说,你应该从你的声明中删除标签,然后就这样做:
typedef struct
{
int messageType;
char *data;
int length;
} Message;
引入不需要的名称没有意义,这也可以保护您免受这种混淆,因为以前没有名称可以写struct
。
答案 1 :(得分:4)
是的,这是预料之中的。 struct Message
是一种类型,您的typedef已创建Message
作为其别名。您可以在声明变量时使用。
答案 2 :(得分:2)
上述内容将struct Message
及其“别名”声明为Message
。两者都很好。
答案 3 :(得分:2)
这是typedef
的正确行为。
答案 4 :(得分:0)
可能就是这个原因,我们已经建议按照上面的说法遵循typedef的命名约定。
struct Message {
int messageType;
char *data;
int length;
}Message_t;
以上是使用struct
声明typedef
的好习惯。在嵌入式中,您通常会发现它是Message_Type
。